Подтвердить что ты не робот

Несколько повторений ключевого слова `in`

По ошибке я использовал более одного ключевого слова in в выражении, но код все еще работает.

В чем смысл:

"a" in "bar" in "foo"   # in ... ?

наивно я думал, что это эквивалентно ("a" in "bar") in "foo" или "a" in ("bar" in "foo"), но это не так, так как оба недействительны. Я получаю такое же поведение в python2 или 3.

4b9b3361

Ответ 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

Изменить Исправлены очевидные опечатки