首先呢,深淺拷貝,都是對對象的拷貝,生成一個看起來一樣的值,但是本質(zhì)區(qū)別就是他們的地址一不一樣,到底是拷貝地址,還是拷貝值!!!
深淺拷貝最明顯的區(qū)別就是可變元素的拷貝
淺拷貝:
拷貝出來新的對象地址和原對象不一樣,但是如果源對象中元素包含可變元素(list,dict,set)之內(nèi)的,那么可變元素的地址和原對象的地址是一樣的!
可以說淺拷貝是淺層的數(shù)據(jù)結(jié)構(gòu)(不可變元素)的拷貝,如果對其中一個對象里面的可變元素修改,那么兩個對象這部分的值都會變修改,因為這部分地址是一樣的!
深拷貝
拷貝出來的新對象,不管淺層還是深層的地址都是獨立的,和原對象不一樣,所以原對象的任何修改對深拷貝對象沒有影響!
光文字不夠形象,下面上自己做的一道小菜,希望能夠幫你開開胃:
import copy
a = [1, 2, 3, 4, ['a', 'b']]
# 賦值
b = a
# 淺拷貝
c = copy.copy(a)
# 深拷貝
d = copy.deepcopy(a)
# 對原對象進行淺層的數(shù)據(jù)修改
a.append(6)
# 對原文件進行深層的數(shù)據(jù)修改
a[4].append('c')
# 可以看出,同內(nèi)存地址的對象進行任意一方修改,雙方都會改變
b.append(7)
print(a, id(a), id(a[4]))
print(b, id(b), id(b[4]))
print(c, id(c), id(c[4]))
print(d, id(d), id(d[4]))
運行結(jié)果如下:
[1, 2, 3, 4, ['a', 'b', 'c'], 6, 7] 37063752 37063560
[1, 2, 3, 4, ['a', 'b', 'c'], 6, 7] 37063752 37063560
[1, 2, 3, 4, ['a', 'b', 'c']] 37167496 37063560
[1, 2, 3, 4, ['a', 'b']] 37167432 37167368
[Finished in 0.1s]
從程序運行結(jié)果來看
1.賦值,是直接引用源對象的地址,就是同一個東西,所有只要一個對象發(fā)生修改,不改是淺層還是深層的元素,等于原地址發(fā)生了修改,所以另一個對象也會改變.
2.淺拷貝,有點藕斷絲連的意思,整體的指向地址和源對象不同,深層次元素地址相同在淺層添加元素時,淺拷貝對象不變,但是深層元素發(fā)生修改時,兩個對象都會改變.
3.深拷貝,就是離婚了,你過你的,我過我的,不管淺層還是深層元素發(fā)生修改,都是對各自的改變,因為各自深層次和淺層次元素地址都不一樣.
不可變元素(int,str,float,tuple...)
可變(list,dict,set)
希望能夠幫助你!謝謝觀看!!!??