Heim >Backend-Entwicklung >Python-Tutorial >Warum verhält sich der „or'-Operator von Python bei mehreren Werten unerwartet?

Warum verhält sich der „or'-Operator von Python bei mehreren Werten unerwartet?

Susan Sarandon
Susan SarandonOriginal
2024-12-26 20:54:18304Durchsuche

Why Does Python's `or` Operator Behave Unexpectedly with Multiple Values?

Warum logische Operationen mit mehreren Werten in Python unterschiedlich ausgewertet werden

Beim Schreiben von Code ist es wichtig zu verstehen, wie Operationen mit mehreren Werten interpretiert werden. In Python verhalten sich bestimmte logische Operatoren anders als ihre scheinbaren englischen Gegenstücke. Betrachten Sie den folgenden Code:

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

Dieser Code versucht, Benutzern mit den Namen „Kevin“, „Jon“ oder „Inbar“ Zugriff zu gewähren. Überraschenderweise gewährt es sogar unbefugten Benutzern wie „Bob“ Zugriff. Warum passiert das?

Den Operator „Oder“ in Python verstehen

Der Operator „Oder“ in Python folgt nicht strikt der herkömmlichen englischen Bedeutung. Bei der Anwendung auf mehrere Ausdrücke wird der erste Ausdruck ausgewählt, der als True ausgewertet wird. Im angegebenen Code:

if name == "Kevin" or "Jon" or "Inbar":

ist logisch äquivalent zu:

if (name == "Kevin") or ("Jon") or ("Inbar"):

Da „Kevin“ True ist, wird der if-Block unabhängig vom Wert von name ausgeführt. Dies bedeutet, dass jeder Benutzer, auch nicht autorisierte, Zugriff erhält.

So vergleicht man einen Wert richtig mit mehreren anderen

Um einen Wert richtig mit mehreren anderen zu vergleichen, gibt es mehrere empfohlene Methoden:

  1. Mehrere Gleichheitsvergleiche: Vergleichen Sie explizit jeden Wert mit == Operator:
if name == "Kevin" or name == "Jon" or name == "Inbar":
  1. Mitgliedschaftstest:Verwenden Sie eine Sammlung gültiger Werte und testen Sie auf Mitgliedschaft:
if name in {"Kevin", "Jon", "Inbar"}:
  1. Generatorausdruck und any(): Explizit gegen jeden Wert prüfen, indem eine Schleife und any() verwendet werden Funktion:
if any(name == auth for auth in ["Kevin", "Jon", "Inbar"]):

Grundlegendes zum Parsen logischer Ausdrücke

Um zu veranschaulichen, wie Python logische Ausdrücke mit mehreren Werten analysiert, finden Sie hier ein Beispiel mit dem ast-Modul:

import ast

expr = ast.parse("a == b or c or d or e", "<string>", "eval")
print(ast.dump(expr, indent=4))

Dieser Code zeigt, dass der Ausdruck analysiert wird als folgt:

Expression(
    body=BoolOp(
        op=Or(),
        values=[
            Compare(
                left=Name(id='a', ctx=Load()),
                ops=[
                    Eq()],
                comparators=[
                    Name(id='b', ctx=Load())]),
            Name(id='c', ctx=Load()),
            Name(id='d', ctx=Load()),
            Name(id='e', ctx=Load())]))

Wie Sie sehen können, wird der ODER-Operator auf vier Unterausdrücke angewendet: den Vergleich a == b und die einfachen Ausdrücke c, d und e. Dies verdeutlicht, warum sich das Parsing so verhält.

Das obige ist der detaillierte Inhalt vonWarum verhält sich der „or'-Operator von Python bei mehreren Werten unerwartet?. 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
Vorheriger Artikel:Bedeutung von DatenstrukturenNächster Artikel:Bedeutung von Datenstrukturen