156 Stimmen

Warum ergibt (1 in [1,0] == True) False?

Als ich mir Antworten auf diese Frage ansah, stellte ich fest, dass ich meine eigene Antwort nicht verstand.

Ich verstehe nicht wirklich, wie dies geparst wird. Warum gibt das zweite Beispiel False zurück?

>>> 1 in [1,0]             # Das ist erwartet
True
>>> 1 in [1,0] == True     # Das ist seltsam
False
>>> (1 in [1,0]) == True   # Das ist es, was ich wollte
True
>>> 1 in ([1,0] == True)   # Aber es handelt sich nicht nur um ein Prezedenzproblem!
                           # Es hat keine Ausnahme im zweiten Beispiel ausgelöst.

Traceback (most recent call last):
  File "", line 1, in 
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

Vielen Dank für jede Hilfe. Ich glaube, ich muss etwas wirklich Offensichtliches übersehen.


Ich denke, das ist subtil anders als die verlinkte Duplikation:

Warum gibt der Ausdruck 0 < 0 == 0 in Python False zurück?.

Beide Fragen haben mit dem menschlichen Verständnis des Ausdrucks zu tun. Es schien mir zwei Möglichkeiten zu geben, den Ausdruck zu bewerten. Natürlich waren beide falsch, aber in meinem Beispiel ist die letzte Interpretation unmöglich.

Wenn man sich 0 < 0 == 0 ansieht, könnte man sich vorstellen, dass jedes Halbjahr bewertet wird und Sinn als Ausdruck ergibt:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

Also erklärt der Link, warum dies False auswertet:

>>> 0 < 0 == 0
False

Aber mit meinem Beispiel 1 in ([1,0] == True) ergibt keinen Sinn als Ausdruck, daher gibt es statt zwei (zugegebenermaßen falschen) möglichen Interpretationen nur eine, die möglich erscheint:

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

199voto

Sven Marnach Punkte 525472

Python wendet hier tatsächlich die Vergleichsoperator-Verkettung an. Der Ausdruck wird übersetzt zu

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

was offensichtlich Falsch ist.

Das passiert auch bei Ausdrücken wie

a < b < c

was übersetzt wird zu

(a < b) und (b < c)

(ohne b zweimal zu evaluieren).

Siehe die Python-Sprachdokumentation für weitere Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X