为什么`True是False == False`,在Python中是假的?

Why is `True is False == False`, False in Python?

本问题已经有最佳答案,请猛点这里访问。

为什么这些语句在使用括号时按预期工作:

1
2
3
4
5
>>> (True is False) == False
True

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

但如果没有括号,它会返回False

1
2
>>> True is False == False
False


基于关于运算符优先级的python文档:

Note that comparisons, membership tests, and identity tests, all have the same precedence and have a left-to-right chaining feature as described in the Comparisons section.

所以实际上,您有一个链接语句,如下所示:

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

您可以假定中心对象将在两个操作和其他对象之间共享(在本例中为false)。

请注意,它也适用于所有比较,包括成员资格测试和身份测试操作,这些操作数如下:

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

例子:

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

在比较运算符方面,python具有唯一的可传递属性。在更简单的情况下会更容易看到。

1
2
if 1 < x < 2:
    # Do something

这就是它看起来的样子。它检查1

1
2
>>> True is False == False
False

它检查"真"是否为"假",而"假"==假,只有一个是"真"。


这是一个双不等式,扩展为(True is False) and (False == False)。例如,请参见在python中编写双不等式时(在代码中显式地,以及如何为数组重写它)的运算符优先级是什么?


python按照您在数学中所期望的方式解释多个(in)相等:

在数学中,a = b = c表示所有a = bb = ca = c

因此,True is False == False是指True == FalseFalse == FalseTrue == False,即False

对于布尔常数,is等于==


如果在计算表达式时遇到具有相同优先级的运算符,则python将执行链接。

comparisons, including tests, which all have the same precedence
chain from left to right

下面提到的运算符具有相同的优先级。

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

因此,当python试图计算表达式True is False == False时,它遇到具有相同优先级的操作符is==,因此它执行从左到右的链接。

因此,表达式True is False == False的实际计算如下:

1
(True is False) and (False == False)

False为输出。