Robię parser Pythona i to mnie naprawdę dezorientuje:
>>> 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
Jak dokładnie działa „in” w Pythonie, w odniesieniu do asocjatywności itp.?
Dlaczego żadne dwa z tych wyrażeń nie zachowują się tak samo?
python
syntax
python-2.x
user541686
źródło
źródło
if a < b < c:
i działać intuicyjniein
jako o operatorze „porównania”. : \Odpowiedzi:
1 in [] in 'a'
jest oceniany jako(1 in []) and ([] in 'a')
.Ponieważ pierwszym warunkiem (
1 in []
) jestFalse
, cały warunek jest oceniany jakoFalse
;([] in 'a')
nie jest nigdy obliczana, więc nie jest zgłaszany żaden błąd.Oto definicje instrukcji:
źródło
[]
jest fałszem, ale np.[]
nie zwraca (nie ).False
[] and anything
[]
False
Python robi specjalne rzeczy za pomocą łańcuchowych porównań.
Następujące elementy są oceniane w różny sposób:
Jednak w obu przypadkach, jeśli pierwsze porównanie jest
False
, reszta stwierdzenia nie zostanie rozpatrzona.W Twoim konkretnym przypadku
Aby zademonstrować pierwszą zasadę powyżej, są to stwierdzenia, których wynikiem jest prawda.
Pierwszeństwo operatorów Pythona: http://docs.python.org/reference/expressions.html#summary
źródło
Z dokumentacji:
Oznacza to, że nie ma w nim skojarzeń
x in y in z
!Poniższe są równoważne:
źródło
Krótka odpowiedź, ponieważ długa jest już tu podawana kilka razy i to w doskonały sposób, jest taka, że wyrażenie boolowskie jest zwarte , to jest zatrzymanie oceny, gdy zmiana prawdy na fałsz lub odwrotnie nie może nastąpić przez dalszą ocenę.
(patrz http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Odpowiedź może być trochę krótka (gra słów nie jest zamierzona), ale jak wspomniano, wszystkie inne wyjaśnienia są już tutaj całkiem dobrze zrobione, ale pomyślałem, że termin zasługuje na wspomnienie.
źródło