Я делаю парсер Python, и это меня действительно сбивает с толку:
>>> 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
Как именно "in" работает в Python в отношении ассоциативности и т.д.?
Почему никакие два из этих выражений не ведут себя одинаково?
python
syntax
python-2.x
пользователь541686
источник
источник
if a < b < c:
и работать интуитивноin
операторе "сравнения", наверное. : \Ответы:
1 in [] in 'a'
оценивается как(1 in []) and ([] in 'a')
.Поскольку первое условие (
1 in []
) равноFalse
, все условие оценивается какFalse
;([] in 'a')
на самом деле никогда не оценивается, поэтому ошибки не возникает.Вот определения операторов:
источник
[]
ложно, но[]
не является,False
например,[] and anything
возвращает[]
(неFalse
).Python делает особые вещи с цепными сравнениями.
По-разному оцениваются следующие:
Однако в обоих случаях, если выполняется первое сравнение
False
, остальная часть утверждения не рассматривается.Для вашего конкретного случая
Также, чтобы продемонстрировать первое правило выше, это утверждения, которые оцениваются как True.
Приоритет операторов Python: http://docs.python.org/reference/expressions.html#summary
источник
Из документации:
Это означает, что нет ассоциативности
x in y in z
!Следующие варианты эквивалентны:
источник
Короткий ответ, поскольку длинное выражение уже дано здесь несколько раз и отличным образом, заключается в том, что логическое выражение закорочено , это остановило оценку, когда изменение истины на ложь или наоборот не может произойти при дальнейшей оценке.
(см. http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Это может быть немного кратко (без каламбура) в качестве ответа, но, как уже упоминалось, все остальные объяснения здесь уже сделаны довольно хорошо, но я подумал, что этот термин заслуживает упоминания.
источник