首頁 >後端開發 >Python教學 >為什麼在 Python 中「a == x or y or z」總是計算為 True?

為什麼在 Python 中「a == x or y or z」總是計算為 True?

Susan Sarandon
Susan Sarandon原創
2024-12-23 19:10:14719瀏覽

Why Does

揭開「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 並授予未經授權的使用者存取權限。

正確的條件構造

要避免此陷阱,正確寫出條件語句有以下三種主要方法語句:

  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 or z」的細微差別對於在Python 中編寫有效的條件語句至關重要,尤其是那些與存取控制相關。請記住使用此處概述的替代結構以確保程式碼準確且安全。

以上是為什麼在 Python 中「a == x or y or z」總是計算為 True?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn