Несколько повторений ключевого слова `in`
По ошибке я использовал более одного ключевого слова in
в выражении, но код все еще работает.
В чем смысл:
"a" in "bar" in "foo" # in ... ?
наивно я думал, что это эквивалентно ("a" in "bar") in "foo"
или "a" in ("bar" in "foo")
, но это не так, так как оба недействительны. Я получаю такое же поведение в python2 или 3.
Ответы
Ответ 1
in
считается оператором сравнения и документация Python для них:
Сравнение может быть скопировано произвольно, например, x < y <= z
эквивалентно x < y and y <= z
, за исключением того, что y
оценивается только один раз (но в обоих случаях z
вообще не оценивается при обнаружении x < y
быть ложным).
Формально, если a, b, c,..., y, z являются выражениями и op1, op2,..., opN являются операторами сравнения, то a op1 b op2 c ... y opN z
эквивалентно a op1 b and b op2 c and ... y opN z
, за исключением того, что каждое выражение оценивается не более одного раза.
Ответ 2
Python оценивает слева направо (вы можете управлять потоком/группировкой с помощью скобок, tho), а операторы сравнения могут быть скопированы произвольно так, чтобы выражение:
"a" in "bar" in "foo" in "baz"
По существу заканчивается как:
"a" in "bar" and "bar" in "foo" and "foo" in "baz"
который разрешает False
.
Ответ 3
Это означает следующее:
("a" in "bar") and ("bar" in "foo")
- или False
Следующие действия могут помочь:
-
"a" in "bar" in "foo"
= > False
-
"a" in "bar" in "foobar"
= > True
-
"b" in "bar" in "foobar"
= > True
-
"c" in "bar" in "foobar"
= > False
Сначала я подумал, что это могло быть "a" in ("bar" in "foo")
, но это, очевидно, вернет следующее:
TypeError: argument of type 'bool' is not iterable
Потому что ("bar" in "foo")
возвращает False
Изменить Исправлены очевидные опечатки