ホームページ  >  記事  >  バックエンド開発  >  CPython で `id({}) == id({})` と `id([]) == id([])` が True を返すのはなぜですか?

CPython で `id({}) == id({})` と `id([]) == id([])` が True を返すのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 04:11:03253ブラウズ

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

CPython の一意のオブジェクト識別子: id({}) == id({}) および id([]) == id([])

である理由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 サイトの他の関連記事を参照してください。

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