2017-10-14 75 views
2

有人可以爲我解釋這個嗎?在Python中連續'是'運算符

>>> None is None is None 
True 
>>> (None is None) is None 
False 

不是'操作符'需要2個操作數,比較左邊的對象,並返回布爾值?

+0

不完全是一個重複的,其他的問題意味着人知道鏈接的表情特徵,並詢問是否可以適用到'是'。 –

+0

@FerdinandBeyer mm,如果你想重新打開它,我會保留給你。通常情況下,當另外一個問題出現時,人們會着迷於着名的[最小驚訝和可變默認參數](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument)真的在問起他們看到的*無法解釋的行爲。我敢打賭,還有其他潛在的重複,但。 –

+0

謝謝你讓我知道。我承認這是重複的,但我真的找不到那些文章或引用,所以我不得不問。 – vbstb

回答

-1

2 < 3 < 4比較。

第二個是否與第一個相同無?是。第三名是否與第二名相同?是。

OTOH,(True) is None顯然是False。括號打破了鏈接。

評價lo < n < hi是一個常見的python習慣用法,這並不會讓你擔心True < 4的中間結果。評估x is y is z不太常見,但對於您的單身人士None這三個對象是相同的。

+1

這並不能解釋任何事情。爲什麼會這樣?僅僅因爲其他一些不相關的運營商有類似的行爲? –

3

因爲它是被解釋爲一個chained comparison

comparison ::= or_expr (comp_operator or_expr)* 
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!=" 
        | "is" ["not"] | ["not"] "in" 

比較可以任意鏈的,例如,x < y <= z相當於 到x < y and y <= z,不同之處在於計算y只有一次(但在這兩種 例當發現x < y爲假時,z根本不被評估)。

在形式上,如果a, b, c, …, y, z是表達式和​​op1, op2, …, opN是 比較運算符,然後a op1 b op2 c ... y opN z相當於 a op1 b and b op2 c and ... y opN z,除了每個表達式是 評價最多一次。

因此,由於is是一個比較運營商,你的第一個表達式等價於:

None is None and None is None 
+0

這是如何得到downvoted? –

+0

@MadPhysicist可能是因爲它是重複的。我可能應該知道。 –

+0

這是否意味着'None不是5 <10'也是'True',因爲如果混合比較運算符好的話? –