Sie verstehen nicht, wie boolesche Ausdrücke funktionieren; sie funktionieren nicht wie ein englischer Satz und vermuten, dass Sie über den gleichen Vergleich für alle Namen hier sprechen. Sie suchen nach:
if x == 1 or y == 1 or z == 1:
x
und y
werden sonst einzeln ausgewertet (False
wenn 0
, sonst True
).
Sie können das verkürzen, indem Sie einen Entainment-Test gegen ein Tupel verwenden:
if 1 in (x, y, z):
oder noch besser:
if 1 in {x, y, z}:
unter Verwendung einer Menge, um von den konstanten Kosten des Membership-Tests zu profitieren (d. h. in
dauert unabhängig vom linken Operanden eine feste Zeit).
Erklärung
Wenn Sie or
verwenden, betrachtet Python jede Seite des Operators als getrennte Ausdrücke. Der Ausdruck x or y == 1
wird zuerst als boolescher Test für x
behandelt, dann wird, wenn dies False ist, der Ausdruck y == 1
getestet.
Dies liegt an der Operator-Präzedenz. Der Operator or
hat eine niedrigere Präzedenz als der Test ==
, daher wird letzterer zuerst ausgewertet.
Auch wenn dies nicht der Fall wäre und der Ausdruck x or y or z == 1
(x or y or z) == 1 interpretiert würde, würde dies immer noch nicht tun, was Sie erwarten.
x or y or z
würde sich auf das erste Argument auflösen, das 'truthy', d. h. nicht False
, numerisch 0 oder leer, ist (siehe boolesche Ausdrücke für Details dazu, was Python in einem booleschen Kontext als falsch betrachtet).
Also für die Werte x = 2; y = 1; z = 0
würde x or y or z
zu 2
auflösen, weil das der erste wahrheitsähnliche Wert in den Argumenten ist. Dann würde 2 == 1
zu False
werden, obwohl y == 1
zu True
wird.
Dasselbe würde für das Gegenteil gelten; das Testen mehrerer Werte gegen eine einzelne Variable; x == 1 or 2 or 3
würde aus den gleichen Gründen scheitern. Verwenden Sie x == 1 or x == 2 or x == 3
oder x in {1, 2, 3}
.
8 Stimmen
Verwenden Sie
1
im (Tuple)7 Stimmen
Wenn Sie eine Liste von Aussagen auf irgendeine Weise bewerten möchten, können Sie die Funktionen
any
/all
verwenden. Zum Beispiel:all([1, 2, 3, 4, False])
gibt False zurückall([True, 1, 2, 3])
gibt True zurückany([False, 0, 0, False])
gibt False zurückany([False, 0, True, False])
gibt True zurück0 Stimmen
Ich habe einen Zusammenfassungsbeitrag basierend auf den Antworten hier gemacht: medium.com/codervlogger/…
11 Stimmen
Diese Frage ist ein sehr beliebtes Duplikatziel, aber ich denke, es ist suboptimal für diesen Zweck. Die meisten Leute versuchen etwas wie
if x == 0 or 1:
, was natürlich ähnlich ist wieif x or y == 0:
, aber möglicherweise trotzdem ein wenig verwirrend für Anfänger ist. Angesichts der schieren Menge an "Warum funktioniert meinx == 0 or 1
nicht?" Fragen, würde ich viel lieber diese Frage als unser kanonisches Duplikatziel für diese Fragen verwenden.2 Stimmen
Achten Sie besonders darauf, wenn Sie mit "falschen" Werten wie
0
,0.0
oderFalse
vergleichen. Sie können leicht falschen Code schreiben, der die "richtige" Antwort liefert.5 Stimmen
Für das Gegenteil, siehe Vergleich eines Strings mit mehreren Elementen in Python
1 Stimmen
@tripleee diese Frage vermischt wirklich zwei separate Aspekte: "Warum funktioniert das nicht?" und "Wie sollte ich es stattdessen schreiben?" Im gegenteiligen Fall (Vergleich eines einzelnen Werts mit mehreren Kandidaten, anstatt mehrerer Werte mit demselben Kandidaten) beantwortet stackoverflow.com/questions/6838238/… die Frage "Wie sollte ich es schreiben?". Für "Warum funktioniert es nicht?", siehe stackoverflow.com/q/20002503 (wie Aran-Fey verlinkt).
1 Stimmen
Siehe auch: stackoverflow.com/questions/6159313/… zum Testen mehrerer Variablen auf Zugehörigkeit in einer Liste.