淺拷貝就是對乙個物件父級(外層)的拷貝,並不會拷貝子級(內部)。簡單舉個例子:
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...