为什么 `False is False is False` 的计算结果为 `True`?

Why does `False is False is False` evaluate to `True`?

为什么在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 ca is b 的结果与 c 进行比较。

你的表情

False is False is False

被视为

(False is False) and (False is False)

所以你得到

True and True

计算结果为 True

您也可以将这种链接与其他运算符一起使用。

1 < x < 10
>>> False is False is False
True

在这种情况下,False 对中的每一个都会被评估。计算前两个 False,如果它是 True,则计算第二个和第三个 False,并计算结果 return。

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

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

所以,你得到了结果。

引用 Python official documentation,

Formally, if a, b, c, ..., y, z are expressions and op1, op2, ..., opN are comparison operators, then a op1 b op2 c ... y opN z is equivalent to a op1 b and b op2 c and ... y opN z, except that each expression is evaluated at most once.

因此,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