"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로 평가되고 승인되지 않은 사용자에게 액세스 권한이 부여됩니다.
적절한 조건부 구성
이러한 함정을 피하려면, 조건문을 올바르게 작성하는 세 가지 기본 방법이 있습니다. 성명:
복수 == 운영자:
if name == "Kevin" or name == "Jon" or name == "Inbar": ...
회원 연산자:
if name in {"Kevin", "Jon", "Inbar"}: ...
생성기 표현식이 있는 모든():
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!