辨異 Python 的深拷貝與淺拷貝

2021-07-09 22:42:42 字數 1399 閱讀 6814

對於 numpy 下的 ndarray(多維陣列)

>>> x = np.array([1, 2, 3])

>>> y = x

>>> z = np.copy(x)

# y 是對 x 的引用 reference

# z 才是對 x 的拷貝

>>> a = [1, 2, 3]

>>> b = a

>>> a[0] = 4

>>> a

[4, 2, 3]

>>> b

[4, 2, 3]

>>> b[1] = 5

>>> b

[4, 5, 3]

>>> a

[4, 5, 3]

![這裡寫描述](

如上圖所示,當執行完b = a的動作後,ab同時指向同一記憶體空間(對同一物件的不同引用),即為淺拷貝,這中間暗含ab共同指向的記憶體空間是可以修改的(mutable)。考慮如下的情況:

>>> a = 1

>>> b = a

>>> a = 2

>>> b

1

# 並未隨著 a 的改變而改變

這是因為a = 11本身不可改(non-mutable),當修改a = 2時,打破了原有的指向關係,重新為a分配了位址空間:

![這裡寫描述](

那麼如何實現深拷貝呢,而不至於引起引用的混亂:

或者使用list內建的copy() 成員函式

>>> a = [1, 2, 3]

>>> b = a.copy()

或者使用切片賦值:

>>> a = [1, 2, 3]

>>> b = a[:]

再來看一種情形:

>>> a = [1, 2, 3]

>>> b = a

>>> a =

>>> b

[1, 2, 3]

# b 指向的還是那片記憶體空間

>>> a = [1, 2, 3]

>>> b = a

>>> a = [1, 2, 4]

# 不是對原始記憶體空間中的值進行修改,而是重新賦值

>>> b

[1, 2, 3]

轉 Python深複製淺複製or深拷貝淺拷貝

copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy a 1,2,3,4,a b c b a c copy.copy a d copy.deepcopy a 很容易理解 a是乙個...

js 淺拷貝直接賦值 js的賦值與淺拷貝 深拷貝

昨天翻了下陣列api,看到concat和slice方法,突然想到這個兩個方法是淺拷貝還是深拷貝,結果陷入了死胡同,為什麼mdn文件說是淺拷貝,但進行簡單的操作為什麼能複製成功啊,糾結半天後才弄清原由,原來我一直把賦值和深淺拷貝搞混了。首先不要把引用型別的賦值歸結為淺拷貝,深拷貝和淺拷貝只針對像 ob...

前端的深拷貝和淺拷貝 前端面試 深拷貝和淺拷貝

面試題目 如何實現對乙個陣列或物件的淺拷貝和深拷貝?wtf,複製還分兩種,第一次遇到這種問題的時候很是無語呢,先來看看一般的答案的理解。淺拷貝是只拷貝一層,深層次的物件級別就只拷貝引用。深拷貝是拷貝多層,每一級別的資料都拷貝出來。也就是說,基本資料型別其實不存在深淺拷貝的問題,只有物件和陣列才存在深...