「is」演算子は整数に対して予期しない動作をします 質問する

「is」演算子は整数に対して予期しない動作をします 質問する

Python で次のような動作が予期しないのはなぜでしょうか?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
>>> 257 is 257
True           # Yet the literal numbers compare properly

私は Python 2.5.2 を使用しています。Python のいくつかの異なるバージョンを試してみたところ、Python 2.3.3 では 99 と 100 の間で上記の動作が見られるようです。

上記に基づいて、Python は内部的に実装されており、「小さい」整数は大きい整数とは異なる方法で保存され、演算子はisその違いを認識できると仮定できます。なぜ漏れやすい抽象化なのでしょうか? 数値であるかどうかが事前にわからない場合に、任意の 2 つのオブジェクトを比較して同じかどうかを確認するより良い方法は何でしょうか?

ベストアンサー1

これをみて:

>>> a = 256
>>> b = 256
>>> id(a) == id(b)
True
>>> a = 257
>>> b = 257
>>> id(a) == id(b)
False

ドキュメントで見つけたものは次のとおりです「プレーン整数オブジェクト」:

-5現在の実装では、からまでのすべての整数の整数オブジェクトの配列が保持されます256。その範囲内で int を作成すると、実際には既存のオブジェクトへの参照が返されるだけです。

つまり、整数256は同一ただし、257 はそうではありません。これは CPython 実装の詳細であり、他の Python 実装では保証されません。

おすすめ記事