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
Freigeben: 2024-12-23 19:10:14
Original
752 Leute haben es durchsucht

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.")
Nach dem Login kopieren

Ü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)
Nach dem Login kopieren

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

(False) or ("Jon") or ("Inbar")
Nach dem Login kopieren

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":
     ...
    Nach dem Login kopieren
  2. In Mitgliedschaft Betreiber:

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

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

Ü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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage