首頁 >後端開發 >Python教學 >Python 清單中的淺拷貝與深拷貝:什麼時候應該使用 `copy.deepcopy()`?

Python 清單中的淺拷貝與深拷貝:什麼時候應該使用 `copy.deepcopy()`?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-09 20:51:11804瀏覽

Shallow vs. Deep Copy in Python Lists: When Should I Use `copy.deepcopy()`?

深度複製清單:超越淺層方法

當嘗試使用list(...) 複製清單時,人們可能會認為它創建了基於id(E0) 與id(E0_copy) 不同的觀察的深度複製。然而,這個假設是有缺陷的。

淺複製陷阱

list(...) 不執行深複製,這涉及遞歸複製內部物件。相反,它只複製最外面的列表,保留對原始內部列表的引用。因此,對內部清單的修改會影響原始清單和複製的清單。

使用 copy.deepcopy 進行深度複製

要建立真正的深度複製,請使用 copy。深複製(...)。此方法遞歸複製所有層級的對象,確保副本的變更不會影響原始對象。

範例

考慮以下程式碼片段:

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b   # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]

在此範例中,list(...) 建立a 的淺表副本。當a[0][1]被修改時,b也會改變,表示它們引用了相同的內部列表。

將此與以下內容進行對比:

>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b    # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]

使用copy.deepcopy,我們創建 a 的真正深層副本。對 a 的變更不會影響 b,確認它們是具有自己的內部清單副本的不同物件。

結論

當深度複製清單是必要的時,請記住使用copy.deepcopy(...) 確保副本的變更不會影響原始副本。這種理解對於維護資料完整性和避免程式碼中出現意外後果至關重要。

以上是Python 清單中的淺拷貝與深拷貝:什麼時候應該使用 `copy.deepcopy()`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn