这令我感到困惑。即使不知道的优先顺序,一个可以检查出两种可能的方式收集的表达会给False
:0 0 == 0(#evaluates为真?)
>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False
但
>>> 0 is 0 == 0
True
怎么来的?
这令我感到困惑。即使不知道的优先顺序,一个可以检查出两种可能的方式收集的表达会给False
:0 0 == 0(#evaluates为真?)
>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False
但
>>> 0 is 0 == 0
True
怎么来的?
当链在Python比较运算符,经营者实际上没有施加到另一个运营商的结果,而是被单独地施加到操作数。也就是说x ? y ?? z
(其中?
和??
都应该站在对一些比较操作)既不等同于(x ? y) ?? z
也不x ? (y ?? z)
,而是x ? y and y ?? z
。
这是>
和合作是特别有用的,让你写的东西像min < x < max
,并让它做你想要什么,而不是一个布尔值比较的数字(这将在大多数其他语言发生)。
您正在使用比较运算链。表达被解释为:
(0 is 0) and (0 == 0)
比较可以被任意链的,例如,
x < y <= z
相当于x < y and y <= z
,不同之处在于y
只计算一次(但在这两种情况下z
当x < y
被发现是错误的时候根本不评估)。
0 is 0
因为Python interns small integers,实现细节,让您得到(True) and (True)
生产True
是真实的。
它必须是欺骗,但'0是0 == 0'被解析为'(0是0)和(0 == 0)',就像'一个== b == C'被解析为'a == b和b == c'。 –
@PaulHankin你应该已经离开,作为一个asnwer –
看看这篇文章:了解Python的“是”经营者(http://stackoverflow.com/questions/13650293/understanding-pythons-is-operator) –