Почему `False is False is False` вычисляется как `True`?

#python

#python #python-внутренние компоненты

Вопрос:

Почему в Python это вычисляется таким образом:

 >>> False is False is False
True
  

но при попытке использования круглых скобок все работает так, как ожидалось:

 >>> (False is False) is False
False
  

Ответ №1:

Связывание операторов типа 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 .

Комментарии:

1. Интересно, что вы можете связать произвольно много «is False», и результат все равно будет true eval(" is ".join(["False" for i in range(n)]))

2. Потому что это работает для любой цепочки, подобной 1 < 2 < 3 < 4 так: 1<2 and 2<3 and 3<4

3. ИМО, эта функция делает его более похожим на обычный английский. Например, если вы объясняете кому-то синглтоны, вы можете указать на это None is None is None .

Ответ №2:

Цитирую официальную документацию 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 .

Ответ №3:

Ваше выражение

 False is False is False
  

обрабатывается как

 (False is False) and (False is False)
  

Таким образом, вы получаете

 True and True
  

и это вычисляется как True .

Вы можете использовать этот вид цепочки и с другими операторами.

 1 < x < 10
  

Комментарии:

1. Итак, 0 > 2 is False возвращает False -> какое интуитивное поведение 🙂

2. @pbaranski Это имеет больше смысла с круглыми скобками: (0 > 2) is False

Ответ №4:

Я думаю, что это 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
  

Итак, вы получаете результат.

Ответ №5:

 >>> False is False is False
True
  

В этом случае оценивается каждая из False пар. Вычисляются первые два False, если это так True , то вычисляются второй и третий False и возвращают результат.

В этом случае, False is False is False эквивалентно and результатам двух команд False is False