ホームページ  >  記事  >  バックエンド開発  >  Python の「is」演算子がコード ブロックごとに大きな整数に対して異なる動作をするのはなぜですか?

Python の「is」演算子がコード ブロックごとに大きな整数に対して異なる動作をするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 15:26:31328ブラウズ

Why Does Python's

大きな整数を使用した 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 によってキャッシュされます)。
  • 対話型コマンド: a と b は、別個のコード ブロックで定義されているため、異なる整数オブジェクトを参照します。

その結果、すべての整数がキャッシュされる func ブロック内で a is b は True と評価され、False と評価されます

注意事項

次の注意点に注意してください:

  • 単一行内で代入ステートメントを連鎖させると、真のアイデンティティ チェックが発生する可能性があります。 .
  • モジュールレベルの実行は、単一のコードブロックのため True を返します。 module.
  • 可変オブジェクトが関与するテストは、キャッシュされていないため、常に False を返します。

結論

Python のコード ブロックの概念を理解することは、解釈するために不可欠です。 ID 比較に関連する予期しない動作。 is は不変オブジェクトのアイデンティティをチェックするのに便利ですが、キャッシュに依存しないため、値の比較には等価演算子 (==) を使用することをお勧めします。

以上がPython の「is」演算子がコード ブロックごとに大きな整数に対して異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。