python 深複製和淺複製

2021-08-04 20:53:25 字數 1273 閱讀 6029

>>> l1 = [1,[2,3],(4,5)]

>>> l2 = list(l1)

>>> l1

[1, [2, 3], (4, 5), 99]

>>> l2

[1, [2, 3], (4, 5)]

>>> l1[1].remove(2)

>>> l1

[1, [3], (4, 5), 99]

>>> l2

[1, [3], (4, 5)]

>>> l2[1] += [11, 12]

>>> l2[2] += (10, 11)

>>> l1

[1, [3, 11, 12], (4, 5), 99]

>>> l2

[1, [3, 11, 12], (4, 5, 10, 11)]

複製列表( 或多數內建的可變集合) 最簡單的方式是使用內建的型別構造方法。但是二者指代不同的物件。 對列表和其他可變序列來說,還能使用簡潔的 l2 = l1[:] 語句建立副本。

這裡構造方法或 [:] 做的是淺複製( 即複製了最外層容器, 副本中的元素是源容器中元素的引用)

如果所有元素都是不可變的, 那麼這樣沒有問題, 還能節省記憶體。 但是, 如果有可變的元素, 可能就會導致上述的問題。

對可變的物件來說, 如 l2[1] 引用的列表, += 運算子就地修改列表。 這次修改在 l1[1] 中也有體現, 因為它是 l2[1] 的別名。

對元組來說, += 運算子建立乙個新元組, 然後重新繫結給變數l2[2]。 這等同於 l2[2] = l2[2] + (10, 11)。 現在, l1 和 l2 中最後位置上的元組不是同乙個物件

copy 模組提供的 deepcopy 和 copy 函式能為任意物件做深複製和淺複製。

>>> from copy import deepcopy

>>> l1

[1, [3, 11, 12], (4, 5), 99]

>>> l3 = deepcopy(l1)

>>> l3

[1, [3, 11, 12], (4, 5), 99]

>>> l3[1] += [13,14]

>>> l1

[1, [3, 11, 12], (4, 5), 99]

>>> l3

[1, [3, 11, 12, 13, 14], (4, 5), 99]

此外我們可以實現特殊方法 __copy__() 和__deepcopy__(), 控制 copy 和 deepcopy 的行為

淺複製和深複製

在c 中,下面三種物件需要呼叫拷貝建構函式 有時也稱 複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入函式體 全域性函式,傳入的是物件 void g fun resume c 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 全域性函式 返回的是物件 resume g fun 3 乙個...

深複製和淺複製

以下 是否完全正確,執行可能得到的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class a class b b void sayhello b b int main 程式正常執行 程式編譯錯誤 程式崩潰 程式死迴圈 這個程式會直接崩潰 voidsayhello ...

深複製和淺複製

main.m 深複製和淺複製。created by yaomars on 16 4 27.import 建立乙個nsdictionary,並建立可變副本和不可變副本,說下是深複製還是淺複製。int main int argc,const char argv 第三種方式 建立乙個nsdictionar...