為什麼在 CPython 中空元組、字典和清單共享記憶體位址?
在 CPython 中,空容器(元組、字典和列表)列表)在其物件標識符方面表現出特殊的行為。具體來說,空元組(如 ())和空字典(如 {})具有相同的記憶體位址,空列表(如 [])也共用公共位址。
說明
當在 CPython 中呼叫 id({}) 或 id([]) 時,會建立一個臨時容器並將其傳遞給 id 函數。然而,在函數處理這個臨時容器之前,它的記憶體位址被記錄並傳遞。然後臨時容器被丟棄,只留下它的記憶體位址。
隨後,當在建立任何其他容器之前再次呼叫 id({}) 或 id([]) 時,相同的記憶體位址很可能會被分配到新的臨時容器。 CPython 的記憶體分配器經常會連續分配記憶體區塊,因此這種情況的可能性很高。
由於 'id' 函數依賴記憶體位址來識別對象,因此 id({}) == id({})且 id([]) == id([]) 成立。這種行為僅發生在這些空容器暫時存在期間,並未表示容器共用任何固有屬性。
與可變性的區別
可變性不是直接的造成這一現象的因素。但是,需要注意的是,可變物件(例如列表)不能像不可變物件(例如元組和字串)一樣被快取或重複使用。因此,對於任何兩個不同的可變對象,id(x) != id(y),即使它們包含相同的元素。
重要性
物件的 ID 是唯一的在其一生中都是獨一無二的。一個物件被銷毀之後或創建之前,另一個物件可以獲得相同的 ID。
以上是為什麼空元組、字典和列表在 CPython 中共享記憶體位址,為什麼這與可變性無關?的詳細內容。更多資訊請關注PHP中文網其他相關文章!