である理由CPython の id() 関数はオブジェクトに一意の識別子を割り当てますが、この一意性はオブジェクトの存続期間に限定されます。オブジェクトが破棄されると、その識別子は再利用できるようになります。
次の動作を考えてみましょう:
<code class="python">tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # makes sense, tuples are immutable assert(id(tuple1) == id(tuple2)) # also makes sense dicts are mutable assert(id(dict1) != id(dict2)) # lists are mutable too assert(id(list1) != id(list2)) assert(id(()) == id(())) # why no assertion error on this? assert(id({}) == id({})) # or this? assert(id([]) == id([]))</code>
なぜ id({}) == id({}) と id([ ]) == id([]) return True?
CPython のメモリ割り当て
これらのアサーションは、CPython のメモリ割り当てメカニズムにより成功します。 id({}) の場合、CPython は辞書を割り当て、そのメモリ アドレスを id() に渡し、その後辞書を破棄します。再度呼び出されると、CPython は空きメモリ ブロックを見つけて同じアドレスを再利用します。可変性は、この動作に直接影響しません。
コード オブジェクトのキャッシュ
コード オブジェクトは、特定の関数、クラス、またはモジュール内で使用されるタプルと文字列をキャッシュします。同じリテラル (整数、文字列、または特定のタプル) が複数回出現する場合、同じオブジェクトが再利用されます。可変オブジェクトは常に実行時に作成され、再利用を防ぎます。
結論
したがって、CPython のオブジェクトの ID は、その存続期間中のみ一意になります。オブジェクトが破棄されると、その ID は他のオブジェクトによって再利用される可能性があります。これは、提供されたコード スニペットで観察される動作を説明しています。
以上がCPython で `id({}) == id({})` と `id([]) == id([])` が True を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。