Ich mache einen Python-Parser, und das verwirrt mich wirklich :
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
Wie genau funktioniert "in" in Python in Bezug auf Assoziativität usw.?
Warum verhalten sich keine zwei dieser Ausdrücke gleich?
python
syntax
python-2.x
user541686
quelle
quelle
if a < b < c:
intuitiv schreiben und arbeiten könnenin
als "Vergleichs" -Operator gedacht, denke ich. : \Antworten:
1 in [] in 'a'
wird bewertet als(1 in []) and ([] in 'a')
.Da die erste Bedingung (
1 in []
) istFalse
, wird der gesamte Zustand bewertet , wieFalse
;([] in 'a')
wird nie tatsächlich ausgewertet, daher wird kein Fehler ausgelöst.Hier sind die Anweisungsdefinitionen:
quelle
[]
ist falsch, wird aber[]
nichtFalse
zB[] and anything
zurückgegeben[]
(nichtFalse
).Python macht spezielle Dinge mit verketteten Vergleichen.
Folgendes wird unterschiedlich bewertet:
In beiden Fällen wird jedoch beim ersten Vergleich
False
der Rest der Aussage nicht berücksichtigt.Für Ihren speziellen Fall
Um die erste Regel oben zu demonstrieren, sind dies Anweisungen, die als True ausgewertet werden.
Vorrang von Python-Operatoren: http://docs.python.org/reference/expressions.html#summary
quelle
Aus der Dokumentation:
Dies bedeutet, dass es keine Assoziativität in gibt
x in y in z
!Folgendes ist äquivalent:
quelle
Die kurze Antwort, da die lange hier bereits mehrmals und auf hervorragende Weise gegeben wird, ist, dass der boolesche Ausdruck kurzgeschlossen ist. Dies hat die Auswertung gestoppt, wenn eine Änderung von wahr in falsch oder umgekehrt nicht durch weitere Auswertung erfolgen kann.
(siehe http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Es mag als Antwort etwas kurz sein (kein Wortspiel beabsichtigt), aber wie bereits erwähnt, sind alle anderen Erklärungen hier bereits recht gut gemacht, aber ich dachte, der Begriff hätte es verdient, erwähnt zu werden.
quelle