ホームページ > バックエンド開発 > Python チュートリアル > Python で `name == 'Kevin' または 'Jon' または 'Inbar' が常に True と評価されるのはなぜですか?

Python で `name == 'Kevin' または 'Jon' または 'Inbar' が常に True と評価されるのはなぜですか?

Susan Sarandon
リリース: 2024-12-21 04:16:14
オリジナル
503 人が閲覧しました

Why Does `name ==

Or を使用した代入が常に True と評価されるのはなぜですか?

論理演算子を使用して複数の値を比較する場合、Python の動作は直感的な理解から逸脱する可能性があります。たとえば、コードでは:

name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
    print("Access granted.")
else:
    print("Access denied.")
ログイン後にコピー

Python はこの式を次のように評価するため、権限のないユーザーにもアクセスが許可されます。

if (name == "Kevin") or ("Jon") or ("Inbar"):
ログイン後にコピー

この場合、結果はどの名前に対しても True になります。 "Jon" と "Inbar" は独立した論理オペランドとして扱われるためです。

値を複数の値と比較する方法その他

複数の値と正しく比較するには:

  • 複数の == 演算子を使用します:
if name == "Kevin" or name == "Jon" or name == "Inbar":
ログイン後にコピー
  • を雇用するコレクション:
if name in {"Kevin", "Jon", "Inbar"}:
ログイン後にコピー
  • any() とジェネレーター式を使用します:
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
ログイン後にコピー

パフォーマンス比較

の場合可読性と効率性を考慮すると、一般にコレクションを使用することが推奨されます。

import timeit
timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")  # Faster
timeit.timeit('any(name == auth for auth in ["Kevin", "Jon", "Inbar"])',
             setup="name='Inbar'")  # Slower
ログイン後にコピー

解析動作の証明

組み込みの ast モジュールは、a == b のような式が確認されることを確認します。 or c または d は、

BoolOp(
    op=Or(),
    values=[
        Compare(left=Name(...), ops=[Eq()], comparators=[Name(...)]),
        Name(...),
        Name(...),
        Name(...)])
ログイン後にコピー

として解析され、「or」が適用されることを示します。個々の比較と表現。

以上がPython で `name == 'Kevin' または 'Jon' または 'Inbar' が常に True と評価されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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