Heim >Backend-Entwicklung >Python-Tutorial >Warum wird „a == x oder y oder z' in Python immer als wahr ausgewertet?
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:
Multiple == Betreiber:
if name == "Kevin" or name == "Jon" or name == "Inbar": ...
In Mitgliedschaft Betreiber:
if name in {"Kevin", "Jon", "Inbar"}: ...
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!