為什么`a == b或c或d`總是評估為True?我正在編寫一個拒絕訪問未授權用戶的安全系統。import sysprint("Hello. Please enter your name:")name = sys.stdin.readline().strip()if name == "Kevin" or "Jon" or "Inbar":
print("Access granted.")else:
print("Access denied.")它按預期授予對授權用戶的訪問權限,但它也允許未經授權的用戶訪問!Hello. Please enter your name:
Bob
Access granted.為什么會這樣?我明確表示,只有在與nameKevin,Jon或Inbar相同時才授予訪問權限。我也嘗試過相反的邏輯if "Kevin" or "Jon" or "Inbar" == name,但結果是一樣的。
2 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
在許多情況下,Python的外觀和行為與自然英語相似,但這是抽象失敗的一種情況。人們可以使用上下文線索來確定“Jon”和“Inbar”是加入動詞“equals”的對象,但Python解釋器更具有文字意識。
if name == "Kevin" or "Jon" or "Inbar":
在邏輯上等同于:
if (name == "Kevin") or ("Jon") or ("Inbar"):
對于用戶Bob來說,相當于:
if (False) or ("Jon") or ("Inbar"):
該or
運營商選擇以積極的第一個參數真值:
if ("Jon"):
由于“Jon”具有正的真值,因此該if
塊執行。這就是導致“授予訪問權限”被打印的原因,無論給出的名稱如何。
所有這些推理也適用于表達式if "Kevin" or "Jon" or "Inbar" == name
。第一個值為"Kevin"
true,因此if
塊執行。
有兩種常用方法可以正確構建此條件。
使用多個
==
運算符顯式檢查每個值:if name == "Kevin" or name == "Jon" or name == "Inbar":
編寫一系列有效值,并使用
in
運算符測試成員資格:if name in ("Kevin", "Jon", "Inbar"):
一般來說,第二個應該是首選,因為它更容易閱讀,也更快:
In [1]: name = "Inbar"In [2]: %timeit name == "Kevin" or name == "Jon" or name == "Inbar"10000000 loops, best of 3: 116 ns per loopIn [3]: %timeit name in ("Kevin", "Jon", "Inbar")10000000 loops, best of 3: 65.2 ns per loop

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
簡單的工程問題,讓我們更進一步。
In [1]: a,b,c,d=1,2,3,4In [2]: a==bOut[2]: False
但是,繼承自語言C,Python將非零整數的邏輯值評估為True。
In [11]: if 3: ...: print ("yey") ...:yey
現在,Python構建在該邏輯上,并允許您使用邏輯文字,例如或整數,等等
In [9]: False or 3Out[9]: 3
最后
In [4]: a==b or c or dOut[4]: 3
寫它的正確方法是:
In [13]: if a in (b,c,d): ...: print('Access granted')
為安全起見,我還建議您不要硬編碼密碼。
添加回答
舉報
0/150
提交
取消