雖然假設Python 中的清單切片會建立物件的副本似乎是合乎邏輯的包含的對象,實際情況並非如此。相反,切片只是產生引用相同底層物件的新清單。這種識別對於理解 Python 的列表切片機制起著至關重要的作用。
考慮一個整數列表:
[1000 + 1, 1000 + 1, 1000 + 1]
儘管具有相同的值,這些物件是具有唯一ID 的不同實體,如下所示:
map(id, [1000 + 1, 1000 + 1, 1000 + 1])
切片此列表可以保持這些引用的完整性:
b = [1000 + 1, 1000 + 1, 1000 + 1][1:3] map(id, b)
兩個映射操作的輸出是相同的,確認切片不會產生整數的新副本。
觀察到類似的行為對於字典或列表等可變物件:
a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']] map(id, a[1:])
切片仍然保留原始引用,表明切片是一種非複製操作。
for i in range(len(a)): x = a[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))雖然切片不涉及複製物件本身,但它會複製引用。在64 位元機器上每個引用佔用8 個字節,每個列表都有額外的72 個位元組的開銷:
儘管如此,對於大多數應用程式來說,這種開銷通常不是一個重要的問題。
雖然 Python 缺乏對視圖的直接支持,但可以採用 numpy 數組等替代選項來實現內存優化。切片 numpy 數組創建與原始視圖共享記憶體的視圖,減少了開銷,但引入了潛在的意外修改。
總之,Python 中的切片保留了對所包含物件的引用,避免了昂貴的複製操作。此機制透過確保切片反映對原始清單所做的變更來簡化程式碼維護。雖然記憶體開銷是一個考慮因素,但對於大多數實際應用程式來說,它通常不是主要問題。以上是Python 清單切片是否會建立物件的副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!