編寫程式碼時,了解如何解釋涉及多個值的運算至關重要。在 Python 中,某些邏輯運算子的行為與其明顯的英語對應項不同。考慮以下程式碼:
name = input("Hello. Please enter your name: ") if name == "Kevin" or "Jon" or "Inbar": print("Access granted.") else: print("Access denied.")
此程式碼嘗試向名為「Kevin」、「Jon」或「Inbar」的使用者授予存取權限。令人驚訝的是,它甚至向“Bob”等未經授權的用戶授予存取權限。為什麼會發生這種情況?
Python 中的 or 運算子並不嚴格遵循常規英語含義。當應用於多個表達式時,它會選擇第一個計算結果為 True 的表達式。在給定的程式碼中:
if name == "Kevin" or "Jon" or "Inbar":
邏輯上等同於:
if (name == "Kevin") or ("Jon") or ("Inbar"):
由於「Kevin」為True,因此無論name的值是什麼,if區塊都會執行。這意味著每個用戶,包括未經授權的用戶,都可以獲得存取權限。
要正確地將一個值與多個其他值進行比較,有幾種推薦的方法:
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"]):
為了說明Python如何解析具有多個值的邏輯表達式,以下是一個使用ast模組:
import ast expr = ast.parse("a == b or c or d or e", "<string>", "eval") print(ast.dump(expr, indent=4))
此程式碼顯示表達式解析為如下所示:
Expression( body=BoolOp( op=Or(), values=[ Compare( left=Name(id='a', ctx=Load()), ops=[ Eq()], comparators=[ Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]))
如您所見,or 運算子應用於四個子表達式:比較a = = b 以及簡單表達式c、d 和e。這闡明了解析的行為為何如此。
以上是為什麼 Python 的「or」運算子在處理多個值時會出現異常行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!