2016-07-29 60 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是真實的。

相關問題