首頁 > 後端開發 > Python教學 > 為什麼 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 總是評估為 True?

為什麼 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 總是評估為 True?

Susan Sarandon
發布: 2024-12-21 04:16:14
原創
460 人瀏覽過

Why Does `name ==

為什麼使用 Or 來賦值總是求值為 True?

當使用邏輯運算子比較多個值時,Python 的行為可能會偏離我們的直覺理解。例如,在程式碼中:

name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
    print("Access granted.")
else:
    print("Access denied.")
登入後複製

即使未經授權的使用者也可以訪問,因為Python 將此表達式計算為:

if (name == "Kevin") or ("Jon") or ("Inbar"):
登入後複製

在這種情況下,對於任何名稱,結果都是True因為「Jon」和「Inbar」被視為獨立的邏輯運算元。

如何將一個值與多個值進行比較其他

要正確比較多個值:

  • 使用多個== 運算子:
if name == "Kevin" or name == "Jon" or name == "Inbar":
登入後複製
  • 僱用集合:
if name in {"Kevin", "Jon", "Inbar"}:
登入後複製
  • 利用any()和產生器表達式:
用any()和產生器表達式:
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
登入後複製

效能比較

import timeit
timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")  # Faster
timeit.timeit('any(name == auth for auth in ["Kevin", "Jon", "Inbar"])',
             setup="name='Inbar'")  # Slower
登入後複製

為了可讀性和為了提高效率,通常首選使用集合:

解析行為證明

BoolOp(
    op=Or(),
    values=[
        Compare(left=Name(...), ops=[Eq()], comparators=[Name(...)]),
        Name(...),
        Name(...),
        Name(...)])
登入後複製

內建的ast 模組確認像 a == b 或 c 這樣的表達式or d 被解析為:

表示「or」應用於各個比較,表達式。

以上是為什麼 Python 中的 `name == 'Kevin' or 'Jon' or 'Inbar'` 總是評估為 True?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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