整数を使用した「is」演算子の不可解な動作
Python では、「is」演算子は 2 つのオブジェクトが同じオブジェクトを参照しているかどうかをチェックします記憶の中で。通常、これは期待どおりに機能しますが、整数では予期しない動作が発生し、開発者の間で混乱が生じます。
大きな整数での予期しない結果
次のコードを考えてみましょう。
a = 256 b = 256 a is b # True (expected) a = 257 b = 257 a is b # False (unexpected)
2 番目の比較で「is」演算子が False を返すのはなぜですか? 257 は 257 と同じではありませんか?
CPython 実装の詳細
この奇妙な動作は、最も一般的な Python インタプリタである CPython の微妙な実装の詳細に起因します。 -5 から 256 までの整数の場合、CPython は整数オブジェクトの配列を維持します。この範囲の整数を作成すると、配列内の既存のオブジェクトへの参照が取得されるだけです。これは、この範囲内の小さな整数について、「is」演算子がそれらが配列内の同じオブジェクトを参照しているかどうかをチェックすることを意味します。
結果と影響
上の例では、a と b に 256 を代入すると、配列から同じオブジェクトを受け取ります。したがって、「a は b」は True と評価されます。ただし、a と b に 257 を割り当てると、同一ではない 2 つの新しいオブジェクトが作成され、「a は b」で False が返されます。
代替比較方法
2 つの任意のオブジェクトが等しいかどうかを比較するには、その型に関係なく、「is」の代わりに「==」演算子を使用できます。これにより、オブジェクトの ID ではなく値がチェックされます。
a = 257 b = 257 a == b # True
「is」演算子は、2 つのオブジェクトがメモリ内のまったく同じオブジェクトを参照しているかどうかを確認する必要がある場合にのみ使用してください。一方、値の比較には「==」を使用する必要があります。
以上がPython の「is」演算子が小さい整数と大きい整数で異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。