Python 深拷貝和淺拷貝

2021-10-05 23:47:53 字數 2216 閱讀 6601

淺拷貝就是對乙個物件父級(外層)的拷貝,並不會拷貝子級(內部)。簡單舉個例子:

import copy

a =[1,

2,3]

b =[3,

4,5]

c =[a, b]

d = copy.copy(c)

上面**中,c是物件父級,a和b是物件子級。當使用淺拷貝copy.copy()時,只會對c進行拷貝,不會對a和b進行拷貝。

具體可以進行驗證:

import copy

a =[1,

2,3]

b =[3,

4,5]

c =[a, b]

d = copy.copy(c)

print(id

(c))

print(id

(d))

print(id

(c[0])

)print(id

(d[0])

)

通過上面的**可以發現,c和d的記憶體位址是不一樣的,而子級的記憶體位址是一樣的。

因此可以簡單理解,當乙個物件有物件父級和物件子級時,淺拷貝只會對物件父級進行拷貝而不會對物件子級進行拷貝。

但是當物件不分父級和子級的時候,淺拷貝就是簡單的對物件進行拷貝:

import copy

a =[1,

2,3]

b = copy.copy(a)

print(id

(a))

print(id

(b))

這種情況下a和b的記憶體位址是不一樣的。

還需要注意的一種情況是,當物件父級的資料型別為不可變型別,比如是元組時,淺拷貝物件的時候還是引用原物件的位址。

import copy

a =[1,

2,3]

b =[3,

4,5]

c =(a, b)

d = copy.copy(c)

print(id

(c))

print(id

(d))

print(id

(c[0])

)print(id

(d[0])

)

在上面這種情況下,物件父級是乙個不可變資料型別,元組。因此在使用淺拷貝的時候,是對原物件的直接引用。因為父級物件是不可變型別,因此如果要修改父級的資料,會重新開闢新的記憶體空間進行存放,因此淺拷貝引用原物件的位址是沒有問題的。

深拷貝是對乙個物件的所有層次的拷貝,內部和外部都會被拷貝。

簡單舉個例子:

import copy

a =[1,

2,3]

b =[2,

3,4]

c =[a, b]

d = copy.deepcopy(c)

print(id

(c))

print(id

(d))

print(id

(c[0])

)print(id

(d[0])

)

**中copy.deepcopy()是對原物件進行深拷貝,這種情況下,物件父級被拷貝,物件子級也會被拷貝,物件之間的記憶體位址完全不同。

但是深拷貝中需要注意,當物件父級是乙個不可變型別,物件子級是乙個不可變型別,當使用深拷貝的時候,新物件是對原物件的引用。

import copy

a =(1,

2,3)

b =(2,

3,4)

c =(a, b)

d = copy.deepcopy(c)

print(id

(c))

print(id

(d))

print(id

(c[0])

)print(id

(d[0])

)

**中的物件父級和子級都是不可變型別,元組。這種情況下,深拷貝得到的新物件是對原物件的引用,兩者對應的記憶體位址是一樣的。

深拷貝的作用是在做資料清洗或者資料修改等操作前,對原始資料複製乙份,以防資料修改,找不到原資料。

當物件父級和物件子級是不可變型別時,是不能在原始物件上對資料進行修改的,這時候深拷貝對物件的拷貝是引用就可以理解了。因為我是不可變資料,所以怎麼對資料進行清洗也不會改變原始資料,所以直接對原物件進行引用就可以了。

python 深拷貝 Python深拷貝和淺拷貝!

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值 b alist,預設淺拷貝傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變...

Python 深拷貝和淺拷貝

淺拷貝只拷貝了引用,並沒有拷貝內容,相當於把原來的引用複製了乙份給新的變數 深拷貝是將原來的值複製了乙份到新的地方 in 30 a 1,2,3 in 31 b a in 32 id a out 32 140618626865352 in 33 id b out 33 140618626865352 ...

python深拷貝和淺拷貝

copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。比深拷貝更加節省記憶體 copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy公升 a 1,2,3,4,a b c b a c copy.copy a d copy.deepcop...