今天面试问到一个题,copy.copy()和copy.deepcopy()有什么区别?
在结束后查询了很多博主,各说其词,各不相同,各有千秋,我综合一下他们的所有说法,得出一下结论:
不论是深拷贝还是浅拷贝,只要是针对不可变的对象,都是拷贝结束后地址一样,但是改变后,就各自安好
但是对于可变的对象,本身拷贝结束后地址都不一样,你咋变都无所谓
(啥!!看不懂,看不懂就对了,我用的白话你能看懂才怪)
综合一下也就是说,对于深浅拷贝之说,都牵扯到拷贝的数据类型,主要就是看被拷贝的数据类型是可变的还是不可变的
且看我分解一二:
浅拷贝(不可变类型数据):
a = 1000
b = copy.copy(a)
print(a, b)
print(id(a), id(b))
a += 1
print(a, b)
print(id(a), id(b))
浅拷贝(不可变类型数据)结果:
1000 1000
2417564683952 2417564683952
1001 1000
2417446622800 2417564683952
从结果上可以看出,针对不可变类型的数据,浅拷贝只是只是拷贝了引用的地址,当原数据改变后,原地址空间必定改变,但是被拷贝后的数据因为是拷贝的地址,所以你变归你变,我们各自安好
浅拷贝(可变类型数据):
a = [1, 2, 3, [1, 2]]
b = copy.copy(a)
print(a, b)
print(id(a), id(b))
a.append(7)
print(a, b)
print(id(a), id(b))
浅拷贝(可变类型数据)结果:
[1, 2, 3, [1, 2]] [1, 2, 3, [1, 2]]
2057799024776 2057796866440
[1, 2, 3, [1, 2], 7] [1, 2, 3, [1, 2]]
2057799024776 2057796866440
从结果上可以看出,针对可变类型的数据,浅拷贝就不再拷贝引用地址,所以导致本来我们两个地址都不一样,你出轨了,管我啥事
深拷贝(不可变类型数据):
a = 100
b = copy.deepcopy(a)
print(a, b)
print(id(a), id(b))
a = 101
print(a, b)
print(id(a), id(b))
深拷贝(不可变类型数据)结果:
100 100
1973054784 1973054784
101 100
1973054816 1973054784
从结果上可以看出,针对不可变类型的数据,我们神奇的发现深拷贝竟然和浅拷贝如此的雷同,所以不多讲
深拷贝(可变类型数据):
a = [1, 2, 3, [1, 2]]
b = copy.deepcopy(a)
print(a, b)
print(id(a), id(b))
a.append(7)
print(a, b)
print(id(a), id(b))
深拷贝(可变类型数据)结果:
[1, 2, 3, [1, 2]] [1, 2, 3, [1, 2]]
2946260222152 2946258063752
[1, 2, 3, [1, 2], 7] [1, 2, 3, [1, 2]]
2946260222152 2946258063752
从结果上可以看出,针对可变类型的数据,我们神奇的发现深拷贝竟然和浅拷贝如此的雷同,所以不多讲
所以就照应了我前边说的话,针对不可变类型数据,深浅拷贝都是拷贝一个引用地址,原数据变,管我鸟事
针对可变数据,深浅拷贝本身就不是一个地址,只是孩子一样,你出轨又生一个,又不是我的,管我鸟事