Python の「is」演算子がコード ブロックごとに大きな整数に対して異なる動作をするのはなぜですか?
Nov 01, 2024 pm 03:26 PM大きな整数を使用した Python の「is」演算子の動作
問題
Python では、is 演算子はオブジェクトの等価性ではなく同一性をチェックします。ただし、特定のシナリオでは、以下に示すように、この動作が予期しない場合があります。
<code class="python">def func(): a = 1000 b = 1000 return a is b a = 1000 b = 1000 print(a is b, func()) # (False, True)</code>
is 比較は、関数内では True を返しますが、関数外では False を返します。評価結果は異なりますが、整数 a と b は同じ値であるように見えます。
説明
この動作を理解するには、Python インタープリターによるコード ブロックの解釈が重要です。 Python リファレンス マニュアルによると、対話的に実行される各コマンドは別個のコード ブロックを構成します。以下はブロックとみなされます:
- モジュール
- 関数本体
- クラス定義
単一のコード ブロック内で、Python は特定のコードをキャッシュします。小さな整数 ([-5, 256] の範囲内) などのオブジェクト。複数の変数が同じ整数リテラルを参照する場合、それらはすべて同じキャッシュされた整数オブジェクトを参照します。ただし、リテラルが異なるコード ブロックで宣言されている場合は、別個の整数オブジェクトが作成されます。
異なるコード オブジェクト、異なる ID
これを説明するために、各ケースのコード オブジェクトを考えてみましょう。
- 関数 func: a と b は同じ整数オブジェクトを参照します (1000 はキャッシュされた整数の範囲内であるため、Python によってキャッシュされます)。
- Interactiveコマンド: a と b は、別々のコード ブロックで定義されているため、異なる整数オブジェクトを参照します。
その結果、func ブロック内で a は b と評価され、すべての整数が True と評価されます。
注意事項
次の注意点に注意してください:
- 単一行内で代入ステートメントを連鎖させると、結果が生じる可能性があります。 True のアイデンティティ チェックです。
- モジュールの単一コード ブロックのため、モジュール レベルの実行は True を返します。
- 可変オブジェクトが関与するテストは、キャッシュされていないため、常に False を返します。
結論
Python のコード ブロックの概念を理解することは、ID 比較に関連する予期しない動作を解釈するために不可欠です。 is は不変オブジェクトのアイデンティティをチェックするのに便利ですが、キャッシュに依存しないため、値の比較には等価演算子 (==) を使用することをお勧めします。
以上がPython の「is」演算子がコード ブロックごとに大きな整数に対して異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









