#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