Python复制的问题——浅拷贝和深拷贝

Python复制——浅拷贝和深拷贝

环境:python3.5

浅拷贝

浅拷贝可以理解为重命名,所以指向同意内存地址

举例:

a=[1,2,3,['a','b','c'],4]
b=a
print(id(b))
print(id(a))

a.append(5)
print(a)
print(b)

b.append(6)
print(a)
print(b)

print(id(a))
print(id(b))

结果:

3975848
3975848
[1, 2, 3, ['a', 'b', 'c'], 4, 5]
[1, 2, 3, ['a', 'b', 'c'], 4, 5]
[1, 2, 3, ['a', 'b', 'c'], 4, 5, 6]
[1, 2, 3, ['a', 'b', 'c'], 4, 5, 6]
3975848
3975848
显然可以理解,C++和python在拷贝方面的区别,python只是重命名。

较深拷贝

使用copy(),可以实现较深拷贝,但需注意较深拷贝和深拷贝的本质区别。

举例:

b=a.copy()
b.append(7)
print(a)
print(b)
print(id(a))
print(id(b))

结果:

[1, 2, 3, ['a', 'b', 'c'], 4, 5, 6]
[1, 2, 3, ['a', 'b', 'c'], 4, 5, 6, 7]
8497832
8498192

但是,如果存在可变元素如tuple或dist,则该元素仍为重命名

举例:

a[3].append('d')
print(id(a[3]))
print(id(b[3]))
print(a)
print(b)
print(id(a))
print(id(b))

结果:

17656408
17656408
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 6]
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 6, 7]
17672872
17673232

可以看到,a[3]-b[3]同一地址,即可变元素仍为重命名,哪怕之前b已经添加元素’7’!!

于是相应地,出现深拷贝

使用deepcopy(),则实现完全拷贝

举例:

import copy
b=copy.deepcopy(a)
a[3].append('f')
print(id(b[3]))
print(id(a[3]))
print(a)
print(b)

结果:

17923768
17656408
[1, 2, 3, ['a', 'b', 'c', 'd', 'f'], 4, 5, 6]
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 6]

结果显而易见。

如果读者有收获或者有问题,欢迎点赞或者评论,谢谢。
python群:190341254
丁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值