CPython では空の辞書とリストが同じ ID を持つのはなぜですか?

Patricia Arquette
リリース: 2024-10-29 03:02:30
オリジナル
430 人が閲覧しました

Why do empty dictionaries and lists have the same ID in CPython?

オブジェクト識別における CPython の興味深い等価性

CPython では、id({}) == id({}) とid([]) == id([]) は開発者を困惑させることがよくあります。不変性はタプルの場合の等価性を説明するかもしれませんが、辞書やリストのような変更可能なオブジェクトの理論的根拠はあまり明らかではありません。

謎の解明

専門家によると、 CPython のメモリ割り当てメカニズムは、この動作において重要な役割を果たします。 id({}) が呼び出されると、新しい辞書が作成され、id 関数に渡されます。ただし、id 関数は、オブジェクト自体を破棄する前に、辞書のメモリ位置を取得するだけです。 2 番目の id({}) が直後に呼び出された場合、新しく作成された辞書が最初の辞書と同じメモリ位置に存在する可能性があります。 CPython の ID はオブジェクト識別子としてメモリの場所を使用するため、2 つの辞書は同じ ID になります。

可変性とオブジェクトの有効期間

可変性は直接影響しません。この現象。むしろ、コード オブジェクト内のリテラル オブジェクトのキャッシュが重要な要素です。同じスコープ内のコード オブジェクト (関数本体など) は、存続期間を通じて同じ整数、文字列、およびタプル リテラルを再利用します。ただし、変更可能なオブジェクトは実行時に動的に作成および変更されるため、再利用が妨げられます。

一時的な ID

本質的に、オブジェクトの ID はその存続期間中のみ一意です。オブジェクトが破棄されるか、オブジェクトが作成される前に、その ID は後続のオブジェクトによって再利用される可能性があります。この動作は変更可能なオブジェクトに特有のものではなく、一般にすべてのオブジェクトに当てはまります。

実践的な意味

この理解には重要な実践的な意味があります。オブジェクトを比較する場合、オブジェクトの同一性の一時的な性質を認識することが重要です。 ID の比較のみに依存すると、特にオブジェクトの作成と破棄を伴うコードでは、誤った結論につながる可能性があります。

以上がCPython では空の辞書とリストが同じ ID を持つのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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