首頁 > 後端開發 > Python教學 > 為什麼 Python 的「or」運算子在處理多個值時會出現異常行為?

為什麼 Python 的「or」運算子在處理多個值時會出現異常行為?

Susan Sarandon
發布: 2024-12-26 20:54:18
原創
310 人瀏覽過

Why Does Python's `or` Operator Behave Unexpectedly with Multiple Values?

為什麼 Python 中具有多個值的邏輯運算的計算結果不同

編寫程式碼時,了解如何解釋涉及多個值的運算至關重要。在 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 運算子

Python 中的 or 運算子並不嚴格遵循常規英語含義。當應用於多個表達式時,它會選擇第一個計算結果為 True 的表達式。在給定的程式碼中:

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

邏輯上等同於:

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

由於「Kevin」為True,因此無論name的值是什麼,if區塊都會執行。這意味著每個用戶,包括未經授權的用戶,都可以獲得存取權限。

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

要正確地將一個值與多個其他值進行比較,有幾種推薦的方法:

  1. 多重相等比較:使用==明確比較每個值運算子:
if name == "Kevin" or name == "Jon" or name == "Inbar":
登入後複製
  1. 成員資格測試: 使用有效值的集合並測試成員資格:
if name in {"Kevin", "Jon", "Inbar"}:
登入後複製
  1. 生成器表達式和any():明確檢查每個值使用循環和any()函數:
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中文網其他相關文章!

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