對於 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
的動作後,a
和b
同時指向同一記憶體空間(對同一物件的不同引用),即為淺拷貝,這中間暗含a
和b
共同指向的記憶體空間是可以修改的(mutable)。考慮如下的情況:
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1
# 並未隨著 a 的改變而改變
這是因為a = 1
,1
本身不可改(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,複製還分兩種,第一次遇到這種問題的時候很是無語呢,先來看看一般的答案的理解。淺拷貝是只拷貝一層,深層次的物件級別就只拷貝引用。深拷貝是拷貝多層,每一級別的資料都拷貝出來。也就是說,基本資料型別其實不存在深淺拷貝的問題,只有物件和陣列才存在深...