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"}:
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 サイトの他の関連記事を参照してください。