2017-10-14 11 views
2

誰かが私のためにこれを説明できますか?Pythonの連続する '演算子'

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

'is'演算子は2つのオペランドをとり、左からオブジェクトを比較し、Booleanを返しますか?

+0

ない正確に複製、他の質問は1つがチェーン表現機能を知っているし、それが適用されるかどうかを尋ねることを意味し「is」になります。 –

+0

@FerdinandBeyer mm、私はあなたがそれを再開したい場合はあなたに任せます。別の質問がある場合、有名な[Least Astonishment]と[Mutable Default Argument](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument)を詐称することがよくあります彼らがその結果として見ている*説明できない*行動について本当に尋ねる。私は他の潜在的な重複があると思う。 –

+0

私にお知らせいただきありがとうございます。私はこれが重複していると認めますが、本当にそれらの記事または参考文献を見つけることができなかったので、私は尋ねなければなりませんでした。 – vbstb

答えて

-1

2 < 3 < 4と比較してください。

2番目のNoneは1番目のNoneと同じですか?はい。 3位は2位と同じですか?はい。

OTOH、(True) is Noneは明らかにFalseです。かっこが連鎖を壊した。

評価するlo < n < hiは一般的なpythonイディオムであり、中間結果がTrue < 4であることを心配させるものではありません。 x is y is zの評価はあまり一般的ではありませんが、シングルトンの場合Noneは3つのオブジェクトが同一です。

+1

これは何も説明しません。これはなぜですか?他の関係のない演算子も同様の動作をしているからです。 –

3

それは次のように解釈されているためchained comparison

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

比較は、例えば、x < y <= z、そのYが(一度だけ評価されている以外は、 x < y and y <= zと同等であるが、両方 場合には、任意に連鎖することができ

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

これはどのように下降表示されましたか? –

+0

@MadPhysicistおそらくそれは重複していたためです。私はおそらく知っていたはずです。 –

+0

これは、比較演算子を混ぜ合わせているので、 'None <5 <10 'も' True'となることを意味しますか? –