Python DeepCopy

Copy 和 DeepCopy的区别。

Ppython中所有数据类型都是对象,变量名只是一个对象的引用(标签)。

copy

不可变对象:相当于增加了一个对象引用(新标签),包括简单数据类型和Tuple,Set

>>> a = 123
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> id(a)
1665100880
>>> id(b)
1665100880
>>> id(c)
1665100880
>>> id(d)
1665100880

可变对象:copy一个新的对象,ID不一样,修改和操作与原对象隔离。包括list和dictionary.

需要注意的是所有复杂类型其实是简单类型的集合,每个复杂类型的子元素都有自己的独立ID,Copy只是Copy了集合对象,并没有Copy子元素,所以子元素修改,会影响Copy前和Copy后的值

DeepCopy:

相当于复制整个对象。不管类型是否可以修改,都是一个全新的对象。新老对象修改互不影响。

>>> a1 = [1,2,3,4,[5,6]]
>>> b1 = a1
>>> c1 = copy.copy(a1)
>>> d1 = copy.deepcopy(a1)

>>> # Copy之后对象ID修改
>>> id(a1)
60430736
>>> id(b1)
60430736
>>> id(c1)
59132544
>>> id(d1)
60429496

>>> #但是子元素对象没有修改
>>> id(a1[1])
1665098944
>>> id(b1[1])
1665098944
>>> id(c1[1])
1665098944
>>> id(d1[1])
1665098944

>>> #修改子元素对象值之后,原对象使用新的子元素对象,Copy的对象还是指向旧的子元素对象
>>> a1[1] = 22
>>> id(a1[1])
1665099264
>>> id(b1[1])
1665099264
>>> id(c1[1])
1665098944
>>> id(d1[1])
1665098944
>>> a1
[1, 22, 3, 4, [5, 6]]
>>> b1
[1, 22, 3, 4, [5, 6]]
>>> c1
[1, 2, 3, 4, [5, 6]]
>>> d1
[1, 2, 3, 4, [5, 6]]

>>> #修改对象本身
>>> a1.append(123)
>>> id(a1)
60430736
>>> id(b1)
60430736
>>> id(c1)
59132544
>>> id(d1)
60429496

>>> #子元素为不可变对象还是原来的对象,可变对象也修改了ID,变成了新的对象
>>> id(a1[4])
22852152
>>> id(b1[4])
22852152
>>> id(c1[4])
22852152
>>> id(d1[4])
22852352

>>> #原子对象,还是使用相同对象
>>> id(a1[4][1])
1665099008
>>> id(c1[4][1])
1665099008
>>> id(d1[4][1])
1665099008

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值