揭開「a == x or y or z」的神秘面紗:為什麼它總是計算為True
在Python 中,無所不在的「a == x or y or 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")
根據布林代數,「或」運算子傳回遇到的第一個真值。在本例中,「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 or z」的細微差別對於在Python 中編寫有效的條件語句至關重要,尤其是那些與存取控制相關。請記住使用此處概述的替代結構以確保程式碼準確且安全。
以上是為什麼在 Python 中「a == x or y or z」總是計算為 True?的詳細內容。更多資訊請關注PHP中文網其他相關文章!