Почему в Python это оценивается следующим образом:
>>> False is False is False
True
но при попытке со скобками вести себя как ожидалось:
>>> (False is False) is False
False
Почему в Python это оценивается следующим образом:
>>> False is False is False
True
но при попытке со скобками вести себя как ожидалось:
>>> (False is False) is False
False
Операторы цепочек, такие как a is b is c
, эквивалентны a is b and b is c
.
Итак, первый пример False is False and False is False
, который оценивается как True and True
, который оценивается как True
Наличие скобок приводит к тому, что результат одной оценки сравнивается со следующей переменной (как вы говорите, вы ожидаете), поэтому (a is b) is c
сравнивает результат a is b
с c
.
Цитата Официальная документация Python,
Формально, если
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
, за исключением того, что каждое выражение оценивается не более одного раза.
Итак, False is False is False
оценивается как
(False is False) and (False is False)
Во втором выражении False is False
используется второе False
в исходном выражении, которое эффективно переводит на
True and True
Вот почему первое выражение оценивается как True
.
Но во втором выражении последовательность оценки выглядит следующим образом.
(False is False) is False
На самом деле
True is False
Вот почему результат False
.
Ваше выражение
False is False is False
рассматривается как
(False is False) and (False is False)
Итак, вы получаете
True and True
и это оценивается как True
.
Вы можете использовать эту цепочку с другими операторами.
1 < x < 10
Я думаю, что False is False is False
означает (False is False) and (False is False)
, но (False is False) is False
означает:
>>> (False is False) is False
False
>>> a_true = (False is False)
>>> a_true
True
>>> a_true is False
False
Итак, вы получите результат.
>>> False is False is False
True
В этом случае оценивается каждая пара False
. Первые два значения False оцениваются, если он True
, затем оценивается второй и третий False
и возвращают результат.
В этом случае False is False is False
эквивалентно and
результатов из 2 команд False is False