「is」演算子の動作が関数内と関数外でキャッシュされていない整数に対して異なるのはなぜですか?

DDD
リリース: 2024-11-03 16:52:30
オリジナル
921 人が閲覧しました

Why Does the `is` Operator Behave Differently with Non-Cached Integers Inside and Outside Functions?

キャッシュされていない整数に対する is 演算子の予期しない動作

質問:

関数内で、is 演算子は戻り値を返します[-5, 256] の範囲外にある 2 つの整数リテラルを比較する場合は True ですが、関数の外で比較した場合は False になります。この不一致はなぜ発生しますか?

答え:

tl;dr:

Python インタープリターはコード ブロックを単位として実行します。 。関数は単一のブロックですが、対話型コマンドは別個のブロックです。各ブロックには、整数を含む独自のオブジェクトが含まれます。したがって、関数内で宣言された整数は同じオブジェクトを指しますが、関数の外で宣言された整数は同じオブジェクトを指しません。 :

コード ブロックは関数内で定義されます。

    ブロック内のリテラル (例: 1000) は単一のオブジェクトとして保存されます。
  • はオブジェクトの同一性をチェックします。つまり、a と b は両方とも同じオブジェクトを指しているため、関数内で a が b である場合は True が返されます。

    • 対話型コマンド:
    • 各コマンドは別個のコード ブロックとして実行されます。
  • 各ブロック内のリテラルは別個のオブジェクトとして保存されます。
  • はオブジェクトの ID をチェックし、オブジェクトがリテラルであるため

    • 追加の観察:
    • この動作は、非整数にも当てはまります。リテラル (float リテラルなど)。
  • Python は辞書を使用してコード オブジェクト内に定数を格納し、新しい定数を追加する前に既存の定数を確認します。

注意事項:

  • 連鎖ステートメント:
  • コマンドが連鎖している場合 (例: a = b = 1000)、それらは単一のコード ブロックとして解釈され、True になります。

モジュール レベルの実行: モジュール レベルの実行 (例: a = b = 1000) は単一のコード ブロック内で発生し、結果は True になります。

  • 可変オブジェクト: この不一致は可変オブジェクトには適用されません。 a = b = [] は常に False を返します。

以上が「is」演算子の動作が関数内と関数外でキャッシュされていない整数に対して異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!