ホームページ > バックエンド開発 > Python チュートリアル > Python の「or」演算子が複数の値に対して予期しない動作をするのはなぜですか?

Python の「or」演算子が複数の値に対して予期しない動作をするのはなぜですか?

Susan Sarandon
リリース: 2024-12-26 20:54:18
オリジナル
311 人が閲覧しました

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 演算子は 4 つの部分式 (比較 a == b と単純な式 c、d、e) に適用されます。これにより、解析がそのように動作する理由が明確になります。

以上がPython の「or」演算子が複数の値に対して予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート