为什么 `False is False is False` 的结果是 `True`?

45

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

>>> False is False is False
True

但是当用括号尝试时,它的表现与预期相符:

>>> (False is False) is False
False
5个回答

69
连接运算符如 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 进行比较。

有趣的是,您可以任意链接多个“is False”,结果仍然为True eval(" is ".join(["False" for i in range(n)])) - Daniel Levin
5
因为它适用于任何链式比较 - 如 1 < 2 < 3 < 4,因此可以表示为:1<2 and 2<3 and 3<4 - pbaranski
在我看来,这个特性使得它更像是普通英语。例如,如果你正在向某人解释单例模式,你可以指出None is None is None - Blacklight Shining

27
引用 Python 官方文档,正式地说,如果 abc、...、yz 是表达式,而 op1op2、...、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


15
您的表达
False is False is False

被视为

(False is False) and (False is False)

所以你得到了

True and True

并且会评估为True

您也可以将此类型的链接与其他运算符一起使用。

1 < x < 10

2
所以 0 > 2 is False 返回 False -> 多么直观的行为 :) - pbaranski
@pbaranski 加上括号更有意义:(0 > 2) 是 False。 - cs95

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

所以,你得到了结果。

0
>>> False is False is False
True

在这种情况下,每个 False 对都会被评估。前两个 False 被评估,如果它是 True,那么第二个和第三个 False 将被评估并返回结果。
在这种情况下,False is False is False 等同于 2 条命令 False is False 的结果的 and

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接