では動作するが動作しない式で、かなり予期しない動作==
が発生しis
ます。
>>> (True == False) is False
True
>>> True == (False is False)
True
>>> True == False is False
False
>>> id(True)
8978640
>>> id(False)
8978192
>>> id(True == False)
8978192
>>> id(False is False)
8978640
では動作するが動作しない式で、かなり予期しない動作==
が発生しis
ます。
>>> (True == False) is False
True
>>> True == (False is False)
True
>>> True == False is False
False
>>> id(True)
8978640
>>> id(False)
8978192
>>> id(True == False)
8978192
>>> id(False is False)
8978640
実際、それは連鎖比較なので、
True == False is False
と同等です
(True == False) and (False is False)
この場合、これは驚くべきことですが、1 <= x < 4
C のような他の言語とは違って書くことができます。
ドキュメントから:
5.9. 比較
C とは異なり、Python のすべての比較演算は同じ優先度を持ち、算術演算、シフト演算、またはビットごとの演算よりも低くなります。また、C とは異なり、a < b < c のような式には、数学の慣習的な解釈があります。
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
True == False is False
は連鎖比較であり、 と同じ意味(True == False) and (False is False)
です。最初の比較 ( True==False
) が false であるため、連鎖比較の結果は false になります。