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

2021-07-15 17:48:10 字數 4042 閱讀 5319

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是乙個列表,表內元素a[4]也是乙個列表(也就是乙個內部子物件);b是對a列表的又乙個引用,所以a、b是完全相同的,可以通過id(a)==id(b)證明。

第4行是淺拷貝,第五行是深拷貝,通過id(c)和id(d)可以發現他們不相同,且與id(a)都不相同:

id(a)

19276104

id(b)

19276104

id(c)

19113304

id(d)

19286976

至於如何看深/淺拷貝的區別,可以通過下面的操作來展現:

這時再檢視結果:

a

[1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

b [1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

c [1, 2, 3, 4, [『a』, 『b』, 『c』, 『hello』]]

d [1, 2, 3, 4, [『a』, 『b』, 『c』]]

可以發現a、b受了操作1、2的影響,c只受操作2影響,d不受影響。a、b結果相同很好理解。由於c是a的淺拷貝,只拷貝了父物件,因此a的子物件( [『a』, 『b』, 『c』, 『hello』])改變時會影響到c;d是深拷貝,完全不受a的影響

簡單點說

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是乙個列表,表內元素a[4]也是乙個列表(也就是乙個內部子物件);b是對a列表的又乙個引用,所以a、b是完全相同的,可以通過id(a)==id(b)證明。

第4行是淺拷貝,第五行是深拷貝,通過id(c)和id(d)可以發現他們不相同,且與id(a)都不相同:

id(a)

19276104

id(b)

19276104

id(c)

19113304

id(d)

19286976

至於如何看深/淺拷貝的區別,可以通過下面的操作來展現:

這時再檢視結果:

a

[1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

b [1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

c [1, 2, 3, 4, [『a』, 『b』, 『c』, 『hello』]]

d [1, 2, 3, 4, [『a』, 『b』, 『c』]]

可以發現a、b受了操作1、2的影響,c只受操作2影響,d不受影響。a、b結果相同很好理解。由於c是a的淺拷貝,只拷貝了父物件,因此a的子物件( [『a』, 『b』, 『c』, 『hello』])改變時會影響到c;d是深拷貝,完全不受a的影響

簡單點說

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是乙個列表,表內元素a[4]也是乙個列表(也就是乙個內部子物件);b是對a列表的又乙個引用,所以a、b是完全相同的,可以通過id(a)==id(b)證明。

第4行是淺拷貝,第五行是深拷貝,通過id(c)和id(d)可以發現他們不相同,且與id(a)都不相同:

id(a)

19276104

id(b)

19276104

id(c)

19113304

id(d)

19286976

至於如何看深/淺拷貝的區別,可以通過下面的操作來展現:

這時再檢視結果:

a

[1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

b [1, 2, 0, 4, [『a』, 『b』, 『c』, 『hello』], 5]

c [1, 2, 3, 4, [『a』, 『b』, 『c』, 『hello』]]

d [1, 2, 3, 4, [『a』, 『b』, 『c』]]

可以發現a、b受了操作1、2的影響,c只受操作2影響,d不受影響。a、b結果相同很好理解。由於c是a的淺拷貝,只拷貝了父物件,因此a的子物件( [『a』, 『b』, 『c』, 『hello』])改變時會影響到c;d是深拷貝,完全不受a的影響

​**********=

淺拷貝是指拷貝的只是原物件元素的引用,換句話說,淺拷貝產生的物件本身是新的,但是它的內容不是新的,只是對原物件的乙個引用。這裡有個例子

alist=[[1, 2], 3, 4]

blist = alist[:] #利用切片完成一次淺拷貝

id(alist)

3084416588l

id(blist)

3084418156l

alist[0][0] = 5

alist

[[5, 2], 3, 4]

blist

[[5, 2], 3, 4]

可以看到,淺拷貝生產了乙個新的物件blist,但是alist的內容確實對alist的引用,所以但改變alist中值的時候,blist的值也跟著變化了。

alist = [1, 2]

blist = alist[:]

blist

[1, 2]

alist

[1, 2]

alist[1]=111

alist

[1, 111]

blist

[1, 2]

為什麼blist的第二個元素沒有變成111呢?因為數字在python中是不可變型別!!

這個順便回顧下python標準型別的分類:

可變型別: 列表,字典

不可變型別:數字,字串,元組

理解了淺拷貝,深拷貝是什麼自然就很清楚了。

python中有乙個模組copy,deepcopy函式用於深拷貝,copy函式用於淺拷貝。

最後,物件的賦值是深拷貝還是淺拷貝?

物件賦值實際上是簡單的物件引用

a = 1

id(a)

135720760

b = a

id(b)

135720760

a和b完全是一回事。

淺複製 深複製

second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...

深複製 淺複製

深複製又叫深拷貝 淺複製又叫淺拷貝 位拷貝。為了理解什麼叫深複製和淺複製,我們舉乙個例子,假如我們有乙個類叫cdemo,有兩個成員,a 和 str.class cdemo 我們再定義乙個建構函式 cdemo int pa,char cstr 然後執行 cdemo a 10,hello cdemo b...

深複製淺複製

淺複製 所謂的淺拷貝就是拷貝指向物件的指標,意思就是說 拷貝出來的目標物件的指標和源物件的指標指向的記憶體空間是同一塊空間.淺拷貝只是一種簡單的拷貝,讓幾個物件公用乙個記憶體,然而當記憶體銷毀的時候,指向這個記憶體空間的所有指標需要重新定義,不然會造成野指標錯誤 深複製所謂的深拷貝指拷貝物件的具體內...