Heim >Backend-Entwicklung >Python-Tutorial >Warum wird „a == x oder y oder z' in Python immer als wahr ausgewertet?

Warum wird „a == x oder y oder z' in Python immer als wahr ausgewertet?

Susan Sarandon
Susan SarandonOriginal
2024-12-23 19:10:14720Durchsuche

Why Does

Das Geheimnis von „a == x oder y oder z“ enthüllen: Warum es sich immer als wahr erweist

In Python das Allgegenwärtige Der Vergleich „a == x oder y oder z“ sorgt immer wieder für Verwirrung. Obwohl es scheinbar unkompliziert ist, kann es zu unerwarteten Ergebnissen führen, insbesondere bei Sicherheitsanwendungen.

Das Problem:

Betrachten Sie den folgenden Code, der autorisierten Benutzern Zugriff gewähren soll:

name = input("Hello. Please enter your name: ")
if name == "Kevin" or "Jon" or "Inbar":
    print("Access granted.")
else:
    print("Access denied.")

Überraschenderweise ermöglicht dieser Code auch unbefugten Benutzern den Zugriff!

Der Lösung: Dekodierung der Syntax

Das Problem liegt in der Interpretation des „oder“-Operators. In Python folgt dieser Operator den Regeln der Booleschen Algebra. Daher entspricht „a == x oder y oder z“ dem folgenden Ausdruck:

(a == x) or (y) or (z)

Wenn ein Benutzer wie „Bob“ versucht, Zugriff zu erhalten, ergibt der Ausdruck Folgendes:

(False) or ("Jon") or ("Inbar")

Gemäß der Booleschen Algebra gibt der „oder“-Operator den ersten gefundenen Wahrheitswert zurück. In diesem Fall ist „Jon“ wahr, was dazu führt, dass der Ausdruck als wahr ausgewertet wird und nicht autorisierten Benutzern Zugriff gewährt wird.

Richtige bedingte Konstruktion

Um diese Falle zu vermeiden, Es gibt drei Hauptmethoden, um die bedingte Anweisung korrekt zu schreiben:

  1. Multiple == Betreiber:

    if name == "Kevin" or name == "Jon" or name == "Inbar":
     ...
  2. In Mitgliedschaft Betreiber:

    if name in {"Kevin", "Jon", "Inbar"}:
     ...
  3. any( ) mit Generator Ausdruck:

    if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):
     ...

Überlegungen zur Leistung

Während der in-Operator im Allgemeinen aus Gründen der Lesbarkeit und Geschwindigkeit bevorzugt wird, finden Sie hier eine Leistung Vergleich:

name = "Inbar"
>>> timeit.timeit("name == \"Kevin\" or name == \"Jon\" or name == \"Inbar\"",
...             setup="name=\"Inbar\"")
0.0960568820592016
>>> timeit.timeit("name in {\"Kevin\", \"Jon\", \"Inbar\"}", setup="name=\"Inbar\"")
0.034957461059093475
>>> timeit.timeit("any(name == auth for auth in [\"Kevin\", \"Jon\", \"Inbar\"])",
...               setup="name=\"Inbar\"")
0.6511583919636905

Fazit

Das Verständnis der subtilen Nuancen von „a == x oder y oder z“ ist besonders für das Schreiben effektiver bedingter Anweisungen in Python von entscheidender Bedeutung diejenigen im Zusammenhang mit der Zugangskontrolle. Denken Sie daran, die hier beschriebenen alternativen Konstruktionen zu verwenden, um einen genauen und sicheren Code zu gewährleisten.

Das obige ist der detaillierte Inhalt vonWarum wird „a == x oder y oder z' in Python immer als wahr ausgewertet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn