面试之copy.copy()和copy.deepcopy()有什么区别?

今天面试问到一个题,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

从结果上可以看出,针对可变类型的数据,我们神奇的发现深拷贝竟然和浅拷贝如此的雷同,所以不多讲

所以就照应了我前边说的话,针对不可变类型数据,深浅拷贝都是拷贝一个引用地址,原数据变,管我鸟事
针对可变数据,深浅拷贝本身就不是一个地址,只是孩子一样,你出轨又生一个,又不是我的,管我鸟事

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值