> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 'a == x 또는 y 또는 z'가 항상 True로 평가되는 이유는 무엇입니까?

Python에서 'a == x 또는 y 또는 z'가 항상 True로 평가되는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-23 19:10:14
원래의
714명이 탐색했습니다.

Why Does

"a == x or y 또는 z"의 비밀 풀기: 항상 참으로 평가되는 이유

Python에서는 유비쿼터스 "a == x 또는 y 또는 z" 비교는 반복되는 혼란의 원인입니다. 겉으로는 간단해 보이지만 특히 보안 애플리케이션에서 예상치 못한 결과를 초래할 수 있습니다.

문제:

승인된 사용자에게 액세스 권한을 부여하기 위한 다음 코드를 고려하세요.

name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
    print("Access granted.")
else:
    print("Access denied.")
로그인 후 복사

놀랍게도 이 코드는 권한이 없는 사용자에게 다음과 같이 접근을 허용합니다. 음!

해결책: 구문 디코딩

문제는 "or" 연산자의 해석에 있습니다. Python에서 이 연산자는 부울 대수 규칙을 따릅니다. 따라서 "a == x or y or z"는 아래 표현식과 동일합니다.

(a == x) or (y) or (z)
로그인 후 복사

"Bob"과 같은 사용자가 액세스 권한을 얻으려고 시도하면 표현식은 다음과 같이 평가됩니다.

(False) or ("Jon") or ("Inbar")
로그인 후 복사

부울 대수학에 따르면 "or" 연산자는 처음으로 발견된 진실한 값을 반환합니다. 이 경우 "Jon"은 참이므로 식이 true로 평가되고 승인되지 않은 사용자에게 액세스 권한이 부여됩니다.

적절한 조건부 구성

이러한 함정을 피하려면, 조건문을 올바르게 작성하는 세 가지 기본 방법이 있습니다. 성명:

  1. 복수 == 운영자:

    if name == "Kevin" or name == "Jon" or name == "Inbar":
     ...
    로그인 후 복사
  2. 회원 연산자:

    if name in {"Kevin", "Jon", "Inbar"}:
     ...
    로그인 후 복사
  3. 생성기 표현식이 있는 모든():

    if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
     ...
    로그인 후 복사

성능 고려 사항

동안 in 연산자는 일반적으로 가독성과 속도 측면에서 선호됩니다. 성능 비교는 다음과 같습니다.

name = "Inbar"
>>> timeit.timeit("name == \"Kevin\" or name == \"Jon\" or name == \"Inbar\"",
...             setup="name=\"Inbar\"")
0.0960568820592016
>>> timeit.timeit("name in {\"Kevin\", \"Jon\", \"Inbar\"}", setup="name=\"Inbar\"")
0.034957461059093475
>>> timeit.timeit("any(name == auth for auth in [\"Kevin\", \"Jon\", \"Inbar\"])",
...               setup="name=\"Inbar\"")
0.6511583919636905
로그인 후 복사

결론

"a == x 또는 y의 미묘한 뉘앙스 이해 또는 z"는 Python에서 효과적인 조건문, 특히 액세스 제어와 관련된 조건문을 작성하는 데 중요합니다. 정확하고 안전한 코드를 보장하려면 여기에 설명된 대체 구성을 사용하는 것을 잊지 마세요.

위 내용은 Python에서 'a == x 또는 y 또는 z'가 항상 True로 평가되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿