为什么`False是False是False`评价为'True`?

时间:2015-01-23 06:45:10

标签: python python-internals

为什么在Python中以这种方式进行评估:

>>> False is False is False
True

但是当使用括号尝试时表现如预期:

>>> (False is False) is False
False

5 个答案:

答案 0 :(得分:65)

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 :(得分:26)

引用Python official documentation

  

正式地,如果abc,...,yz是表达式,op1,{{ 1}},...,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

答案 2 :(得分:14)

你的表达

False is False is False

被视为

(False is False) and (False is False)

所以你得到了

True and True

并评估为True

你也可以和其他运营商一起使用这种链接。

1 < x < 10

答案 3 :(得分:5)

我认为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

所以,你得到了结果。

答案 4 :(得分:0)

>>> False is False is False
True

在这种情况下,评估每个False对。评估前两个False,如果它是True,则评估第二个和第三个False并返回结果。

在这种情况下,False is False is False相当于2个命令and的结果False is False