Heim >Backend-Entwicklung >Python-Tutorial >Warum verhält sich der „or'-Operator von Python bei mehreren Werten unerwartet?
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?
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.
Um einen Wert richtig mit mehreren anderen zu vergleichen, gibt es mehrere empfohlene Methoden:
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"]):
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!