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