重複の可能性:
Python の「is」演算子が整数で予期しない動作をする
なぜ (0-6) が -6 = False なのですか?
>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
同じ操作で、あるケースでは False になり、別のケースでは True になる方法を誰か説明してもらえますか...
もう少し奇妙な...
>>> (0 - 10) is (0 - 10)
False
重複の可能性:
Python の「is」演算子が整数で予期しない動作をする
なぜ (0-6) が -6 = False なのですか?
>>> (0 - 10) is -10
False
>>> (0 - 5) is -5
True
同じ操作で、あるケースでは False になり、別のケースでは True になる方法を誰か説明してもらえますか...
もう少し奇妙な...
>>> (0 - 10) is (0 - 10)
False
等価性テストには使用しないでください。これis
は同一性演算子であり、2 つの等しいオブジェクトが必ずしも同一であるとは限りません (つまり、コンピューターのメモリ内の同じアドレスに存在します)。一部の小さな整数はキャッシュされて再利用される可能性がありますが、すべてではないため、ここで異なる結果が表示されます。
さらに、この動作は実装に依存するため、これが常に当てはまるとは限りません。
ドキュメントから:
現在の実装では、-5 から 256 までのすべての整数に対して整数オブジェクトの配列が保持されます。その範囲で int を作成すると、実際には既存のオブジェクトへの参照が返されます。したがって、1 の値を変更できるはずです。この場合の Python の動作は未定義であると思われます。:-)
そして、私の経験から: 私の Python2.7 では、との間を(0 + x) is x
返します。True
x
-5
+256
False
のインスタンスを作成int
し、それらがすべて同じオブジェクトであることを期待しています。これは通常、他のほとんどのオブジェクトではまったく機能しないため、まったく機能しないことに驚かれることでしょうTrue
。
この理由は、Python が起動時に頻繁に使用される整数オブジェクトの束を作成し、呼び出されたときにいつでも再利用できるためです。int
不変であるため、これは問題なく機能しますが、単なる最適化です。
オペレーターは、is
2 つのオブジェクトが同じ ID を持っているかどうか (低レベルの用語では、それらの表現がメモリ内の同じアドレスにあるかどうか) を判断します。
a = object()
a is a
True
Python では、数値は他のオブジェクトと同様にオブジェクトであるため、is
作成方法によって機能するかどうかが異なります。
a = 0
a is a
True
コードが機能する場合と機能しない場合があるのは、Python が小さな整数をインターンするためです。つまり、新しい数値オブジェクトを作成するのではなく、-5
小さな整数のキャッシュを保持し、適切な数値オブジェクトを提供します。一方、あなたの場合-10
はインターンされていないため、Python は毎回新しい数値オブジェクトを作成する必要があります。
インターンされるその他のオブジェクトには、短い文字列 (1 文字の文字列を含む)、True
および `False.
インターンシップに頼るべきではありません。代わりに、演算子is
を使用する必要があります。==
同じ番号のオブジェクトを再利用する可能性のある実装の最適化がおそらくいくつかあります。
そういうわけであなたはTrue
時々得ていると思います。
$ python3
Python 3.2.3 (default, May 3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(3)
9357472
>>> id(3)
9357472
あなたが同等性チェックを探していると私が思うもの==
:
>>> 3 is 3 # Result may depend on implementation details
True
>>> 3 == 3 # Always True
True