为什么在Python中`True is False == False`是False?

32
为什么使用括号时这些语句按预期工作:
>>> (True is False) == False
True

>>> True is (False == False)
True

但是当没有括号时,它会返回False吗?

>>> True is False == False
False

4
显然,你遇到了 Python 语法中少数令人困惑的角落(即结果相当令人惊讶的地方)。 - 6502
5个回答

17

当涉及比较运算符时,Python具有独特的传递性质。在更简单的情况下看起来会更容易理解。

if 1 < x < 2:
    # Do something

这就是它看起来像的功能。它检查1<x和x<2是否成立。在您的非括号代码中也是同样的情况。

>>> True is False == False
False

它正在检查True是否为False 并且 False == False,只有其中之一是真的。


啊!我使用了 1 < x < 2,只是认为这是一个特殊情况,没有意识到它也适用于其他运算符。 - Samuel O'Malley

17

根据Python 表达式文档中关于运算符优先级的说明:

请注意,比较、成员测试和身份测试都具有相同的优先级,并且具有从左到右的链式特性,如“比较”部分所述。

因此,实际上你可以像下面这样链接多个语句:

>>> (True is False) and (False==False)
False

假设中心对象将在两个操作和其他对象之间共享(在这种情况下为False)。

请注意,所有比较,包括成员资格测试和身份测试操作,都适用于其后的操作数。

in, not in, is, is not, <, <=, >, >=, !=, ==

例子:

>>> 1 in [1,2] == True
False

8

简而言之,这是一个bug吗?它看起来非常违反直觉。 - Patrick Roberts
2
另一方面,您可以编写0 < 0.25 < 0.5,这在其他语言中会产生奇怪的结果。 - Thomas Baruchel
1
不,这不是一个错误 - 这是语言意料之外的预期操作。 - holdenweb

2

Python会像数学一样解释多个(不)相等的情况:

在数学中,a = b = c 意味着所有的 a = bb = ca = c 都成立。

因此,True is False == False 表示 True == FalseFalse == False 以及 True == False,这是 False

对于布尔常量,is 等同于 ==


实际上,“a is b == c”只是意味着“(a is b) and (b == c)”:并没有比较ac。考虑0.0 == 0 is 0 - Lynn
@Mauris 我的意思是如果 a 是 b,b 是 c,那么 a 就是 c。我只是提供了一种简单的确定结果的方法,而不是如何处理它。 - xyz

1
当Python在计算表达式时遇到相同优先级的运算符,它会进行链接。以下运算符具有相同的优先级:比较(包括测试),它们从左到右链接。
in, not in, is, is not, <, <=, >, >=, <>, !=, ==

因此,当Python尝试评估表达式True is False == False时,它会遇到具有相同优先级的运算符is==,因此它从左到右进行链接。
因此,表达式True is False == False实际上被评估为:
(True is False) and (False == False)

将以下内容翻译为中文:"

输出为False

"

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