コードを記述するときは、複数の値を含む演算がどのように解釈されるかを理解することが重要です。 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 演算子は 4 つの部分式 (比較 a == b と単純な式 c、d、e) に適用されます。これにより、解析がそのように動作する理由が明確になります。
以上がPython の「or」演算子が複数の値に対して予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。