为什么当使用括号时,这些语句会像预期的那样工作:
>>> (True is False) == False
True
>>> True is (False == False)
True
但是当没有括号时它返回False
?
>>> True is False == False
False
基于python 文档关于运算符优先级:
请注意,比较、成员关系测试和标识测试都具有相同的优先级,并且具有从左到右的链接特性,如比较部分所述。
实际上你有一个像这样的链式语句:
>>> (True is False) and (False==False)
False
您可以假设中心对象将在2个操作和其他对象之间共享(在这种情况下为False)。
请注意,对于所有比较,包括操作数后面的成员测试和标识测试操作,也是如此:
in, not in, is, is not, <, <=, >, >=, !=, ==
的例子:
>>> 1 in [1,2] == True
False
在比较操作符方面,Python有一个独特的传递属性。简单一点会更容易看清楚。
if 1 < x < 2:
# Do something
就像它看起来的那样。它检查1 这是一个二重不等式,展开为(True is False) and (False == False)
。例如,请参阅在Python中编写双不等式时的操作符优先级是什么(在代码中显式地显示,以及如何在数组中覆盖它?)
Python解释多个(in)等式的方式与您在Math中期望的方式相同:
数学中a = b = c
是指所有a = b
, b = c
和a = c
。
所以True is False == False
代表True == False
和False == False
和True == False
,也就是False
。
对于布尔常量,is
等价于==
如果Python在计算表达式时遇到相同优先级的操作符,则执行链接。
比较,包括具有相同优先级的测试链从左到右
下面提到的操作符具有相同的优先级。
in, not in, is, is not, <, <=, >, >=, <>, !=, ==
因此,当Python尝试计算表达式True is False == False
时,它遇到具有相同优先级的操作符is
和==
,因此它执行从左到右的链接。
因此,表达式True is False == False
实际上被求值为:
(True is False) and (False == False)
给出False
作为输出