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

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

Susan Sarandon
發布: 2024-12-23 19:10:14
原創
714 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板