CPython で空のタプル、辞書、リストがメモリ アドレスを共有するのはなぜですか?
CPython では、空のコンテナ (タプル、辞書、およびリスト)リスト) は、オブジェクト識別子に関して独特の動作を示します。具体的には、() などの空のタプルと {} などの空の辞書は同じメモリ アドレスを持ち、[] などの空のリストも共通のアドレスを共有します。
CPython で id({}) または id([]) が呼び出されるとき、一時コンテナーが作成され、id 関数に渡されます。ただし、関数がこの一時コンテナを処理する前に、そのメモリ アドレスが記録され、渡されます。その後、一時コンテナは破棄され、そのメモリ アドレスだけが残ります。
その後、他のコンテナが作成される前に id({}) または id([]) への別の呼び出しが行われると、同じメモリ アドレスが新しい一時コンテナに割り当てられる可能性があります。 CPython のメモリ アロケータはメモリ ブロックを連続して割り当てることが多いため、このシナリオが発生する可能性が非常に高くなります。
「id」関数はオブジェクトの識別にメモリ アドレスに依存しているため、id({}) == id({}) となります。および id([]) == id([]) が成り立ちます。この動作は、これらの空のコンテナが一時的に存在している間にのみ発生し、コンテナが固有のプロパティを共有していることを示すものではありません。
可変性との区別
可変性は直接的なものではありませんこの現象の要因です。ただし、リストなどの変更可能なオブジェクトは、タプルや文字列などの不変オブジェクトのようにキャッシュしたり再利用したりできないことに注意することが重要です。したがって、同じ要素が含まれている場合でも、2 つの異なる可変オブジェクトに対して id(x) != id(y) となります。
意味
オブジェクトの ID は、一生を通じて唯一無二の存在。オブジェクトが破棄された後、またはオブジェクトが作成される前に、別のオブジェクトが同じ ID を取得できます。
以上がCPython では空のタプル、辞書、リストがメモリ アドレスを共有するのはなぜですか?また、これが可変性に関係しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。