Als ich nach Antworten auf diese Frage suchte , stellte ich fest, dass ich meine eigene Antwort nicht verstand.
Ich verstehe nicht wirklich, wie das analysiert wird. Warum gibt das zweite Beispiel False zurück?
>>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
Vielen Dank für jede Hilfe. Ich denke, ich muss etwas wirklich Offensichtliches vermissen.
Ich denke, das unterscheidet sich geringfügig von dem verknüpften Duplikat:
Warum gibt der Ausdruck 0 <0 == 0 in Python False zurück? .
Beide Fragen haben mit dem menschlichen Verständnis des Ausdrucks zu tun. Meiner Meinung nach gab es zwei Möglichkeiten, den Ausdruck zu bewerten. Natürlich waren beide nicht richtig, aber in meinem Beispiel ist die letzte Interpretation unmöglich.
Wenn 0 < 0 == 0
Sie sich das ansehen, können Sie sich vorstellen, dass jede Hälfte bewertet wird und als Ausdruck Sinn ergibt:
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Der Link antwortet also, warum dies bewertet wird False
:
>>> 0 < 0 == 0
False
Aber da mein Beispiel 1 in ([1,0] == True)
als Ausdruck keinen Sinn ergibt, scheint anstelle von zwei (zugegebenermaßen falschen) möglichen Interpretationen nur eine möglich zu sein:
>>> (1 in [1,0]) == True
quelle
==
Bindung ist enger alsin
, wird also[1,0] == True
zuerst ausgewertet, dann wird das Ergebnis davon eingespeist1 in other_result
.Antworten:
Python wendet hier tatsächlich die Verkettung von Vergleichsoperatoren an. Der Ausdruck wird übersetzt in
das ist offensichtlich
False
.Dies geschieht auch für Ausdrücke wie
die zu übersetzen
(ohne zu bewerten
b
zweimal ).Weitere Informationen finden Sie in der Dokumentation zur Python-Sprache .
quelle
1 in [1, 0] == [1, 0]
ergibt sich zuTrue
.in
Operator eine höhere Priorität als andere Vergleichsoperatoren hätte und nicht verkettet wäre. Aber vielleicht fehlt mir ein Anwendungsfall.in
- schließlichx < y < z
macht es Sinn, aber nicht so sehr mitx in y in z
in
dies einfach nicht mehr der Fall und macht es ziemlich kontraintuitiv.