首頁  >  文章  >  後端開發  >  為什麼 CPython 中 `id({}) == id({})` 和 `id([]) == id([])` 回傳 True?

為什麼 CPython 中 `id({}) == id({})` 和 `id([]) == id([])` 回傳 True?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-30 04:11:03257瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn