Warum wird (1 in [1,0] == True) als False ausgewertet?

153

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 == 0Sie 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
Peter Wood
quelle
1
Operator-Vorrang ... die ==Bindung ist enger als in, wird also [1,0] == Truezuerst ausgewertet, dann wird das Ergebnis davon eingespeist 1 in other_result.
Marc B
Ich habe das Python-2.7-Tag entfernt, da sich Python 3.2 genauso verhält.
lvc
1
@ Marc B: Erklärt nicht den zweiten Ausdruck
Scott Hunter
32
@MarcB, die Frage beinhaltete einen Test mit Klammern, um diese Interpretation zu widerlegen.
Mark Ransom

Antworten:

194

Python wendet hier tatsächlich die Verkettung von Vergleichsoperatoren an. Der Ausdruck wird übersetzt in

(1 in [1, 0]) and ([1, 0] == True)

das ist offensichtlich False.

Dies geschieht auch für Ausdrücke wie

a < b < c

die zu übersetzen

(a < b) and (b < c)

(ohne zu bewerten b zweimal ).

Weitere Informationen finden Sie in der Dokumentation zur Python-Sprache .

Sven Marnach
quelle
40
Zusätzlicher Beweis dafür 1 in [1, 0] == [1, 0]ergibt sich zu True.
Andrew Clark
9
Ich habe das lange als Sprachwarze angesehen. Ich hätte es vorgezogen, wenn der inOperator eine höhere Priorität als andere Vergleichsoperatoren hätte und nicht verkettet wäre. Aber vielleicht fehlt mir ein Anwendungsfall.
Steven Rumbalski
3
schöner Fang, daran habe ich gar nicht gedacht. Es macht nicht viel Sinn, die Verkettung von in- schließlich x < y < zmacht es Sinn, aber nicht so sehr mitx in y in z
BlueRaja - Danny Pflughoeft
7
@Sven Nützlich: vielleicht. Lesbar: definitiv nicht. Python gibt vor, mit dieser Konvention die gängige mathematische Typografie zu emulieren, aber wenn dies verwendet wird, ist indies einfach nicht mehr der Fall und macht es ziemlich kontraintuitiv.
Konrad Rudolph
6
@KonradRudolph: Ich habe in mathematischen Texten mehr als einmal Gedanken wie "1 ≤ x ∈ ∈" gesehen, aber ich stimme Ihnen grundsätzlich zu.
Sven Marnach