CPython 在物件辨識中有趣的等價
在CPython 中, id({}) == id({}) 與id([]) == id([]) 常常讓開發人員感到困惑。雖然不變性可以解釋元組情況下的等價性,但字典和列表等可變對象的基本原理不太明顯。
揭開神秘面紗
根據專家的說法, CPython 的記憶體分配機制在這種行為中發揮著重要作用。當呼叫 id({}) 時,會建立一個新字典並將其傳遞給 id 函數。然而,id 函數在丟棄物件本身之前僅捕獲字典的記憶體位置。如果不久之後呼叫第二個 id({}),則新建立的字典可能恰好位於與第一個字典相同的記憶體位置。由於 CPython 中的 id 使用記憶體位置作為物件標識符,因此兩個字典最終具有相同的 id。
可變性和物件生命週期
可變性不會直接影響這種現象。相反,程式碼物件中文字物件的快取是關鍵因素。同一範圍內的程式碼物件(例如函數體)在其整個生命週期中重複使用相同的整數、字串和元組文字。然而,可變物件是在運行時動態建立和修改的,從而防止重複使用。
臨時身分
本質上,物件的 id 僅在其生命週期內是唯一的。一旦物件被銷毀或在創建之前,其 id 可能會被後續物件重複使用。這種行為並不是可變對象所特有的,而是普遍適用於所有對象。
實際意義
這種理解具有重要的實際意義。在比較物件時,認識到物件身分的瞬態性質至關重要。僅依靠 id 比較可能會導致錯誤的結論,特別是在涉及物件創建和銷毀的程式碼中。
以上是為什麼 CPython 中空字典和列表具有相同的 ID?的詳細內容。更多資訊請關注PHP中文網其他相關文章!