Python 清單切片是否會建立物件的副本?

Susan Sarandon
發布: 2024-11-06 07:01:03
原創
952 人瀏覽過

 Does Python List Slicing Create Copies of Objects?

Python 中的清單切片:維護物件完整性

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!