python中的浅拷贝与深拷贝

赋值,copy()与deepcopy()

Eva_J小姐姐的博客对python的变量与内存的关系进行了详细的解释。简单来说,在python中将一个变量赋值给另一个变量即是两个变量指向了同一块存储变量值的内存空间,而对变量的初始化即是为变量开辟出一块新的内存空间。因此,对于基本数据类型(int, long, float, bool, str等)来说,将一个变量值赋给另一个变量,与为两个变量初始化相同值,在效果上并没有什么区别。
然而对于复杂数据类型,例如set, list, tuple, dict以及各种自定义类的对象,将变量a的值赋给变量b就相当于给a起了一个别名b,此时改变a的值,b的值也会同时改变,例如:

>>> a = [1,2,3]
>>> b = a
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]

对于自定义的类也是如此。因此将一个对象(列表/元组/..)直接赋值给另一个对象(列表/元组/..)并不能对原对象进行复制。要想实现复制操作,需要利用copy()或deepcopy()函数。
copy()和deepcopy()函数都是copy包中的函数,用于对对象进行复制,复制后新对象与原对象不会再互相影响。例如:

>>> import copy
>>> a = [1,2,3]
>>> b = copy.copy(a)     #此处使用deepcopy()效果相同
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]

copy()与deepcopy()的区别在于,利用copy()复制对象(列表/元组/..)时,内存为对象开辟了一块新的空间,然而对象的子对象依旧是原对象的子对象的别名。例如:

>>>import copy
>>> a = [[1,2,3], [4,5,6]]
>>> b = copy.copy(a)
>>> a[1] = [1,2,3]
>>> a
[[1, 2, 3], [1, 2, 3]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 4
>>> a
[[1, 4, 3], [1, 2, 3]]
>>> b
[[1, 4, 3], [4, 5, 6]]

可以看出,虽然使用了copy()函数,在修改a中的子数组值时,b中子数组的值也会发生改变。要复制一个与原对象(列表/元组)完全独立的对象,应使用deepcopy(),例如:

>>> import copy
>>> a = [[1,2,3], [4,5,6]]
>>> b = copy.deepcopy(a)
>>> a[0][1] = 4
>>> a
[[1, 4, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值