2016-07-29 59 views
21

这令我感到困惑。即使不知道的优先顺序,一个可以检查出两种可能的方式收集的表达会给False0 0 == 0(#evaluates为真?)

>>> (0 is 0) == 0 
False 
>>> 0 is (0 == 0) 
False 

>>> 0 is 0 == 0 
True 

怎么来的?

+10

它必须是欺骗,但'0是0 == 0'被解析为'(0是0)和(0 == 0)',就像'一个== b == C'被解析为'a == b和b == c'。 –

+0

@PaulHankin你应该已经离开,作为一个asnwer –

+0

看看这篇文章:了解Python的“是”经营者(http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator) –

回答

5

当链在Python比较运算符,经营者实际上没有施加到另一个运营商的结果,而是被单独地施加到操作数。也就是说x ? y ?? z(其中???都应该站在对一些比较操作)既不等同于(x ? y) ?? z也不x ? (y ?? z),而是x ? y and y ?? z

这是>和合作是特别有用的,让你写的东西像min < x < max,并让它做你想要什么,而不是一个布尔值比较的数字(这将在大多数其他语言发生)。

19

您正在使用比较运算链。表达被解释为:

(0 is 0) and (0 == 0) 

Comparisons documentation

比较可以被任意链的,例如,x < y <= z相当于x < y and y <= z,不同之处在于y只计算一次(但在这两种情况下zx < y被发现是错误的时候根本不评估)。

0 is 0因为Python interns small integers,实现细节,让您得到(True) and (True)生产True是真实的。

相关问题