Python复制——浅拷贝、深拷贝、切片

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

环境:python3.5
新增:我发现一个有趣的现象:

打印函数

#为减少代码量,方便阅读,定义打印函数
def printab(a,b):
    print(a)
    print(b)
    print(id(a))
    print(id(b))

切片复制

a=[1,2,3,['a','b','c'],4]

b=a[:]
printab(a,b)
b[3].append('s')
printab(a,b)

结果:

[1, 2, 3, ['a', 'b', 'c'], 4]
[1, 2, 3, ['a', 'b', 'c'], 4]
2967054934728
2967054981064
[1, 2, 3, ['a', 'b', 'c', 's'], 4]
[1, 2, 3, ['a', 'b', 'c', 's'], 4]
2967054934728
2967054981064

浅拷贝

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

举例:
a=[1,2,3,['a','b','c'],4]

b=a
printab(a,b)
a.append(5)
printab(a,b)

b.append(6)
printab(a,b)

结果:

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

较深拷贝

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

举例:
a=[1,2,3,['a','b','c'],4]

b=a.copy()
b.append(7)
printab(a,b)

结果:

[1, 2, 3, ['a', 'b', 'c'], 4]
[1, 2, 3, ['a', 'b', 'c'], 4, 7]
2549684724424
2549684770760

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

举例:
a=[1,2,3,['a','b','c'],4]

b=a.copy()
a[3].append('d')
printab(a[3],b[3])
printab(a,b)

结果:

['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
1989518779336
1989518779336
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
1989520351944
1989520398280

可以看到,a[3]-b[3]同一地址,即可变元素仍为重命名,哪怕之前b已经添加元素’7’!!
注意和切片复制对比,使用copy()本质上就是切片复制!!!!

于是相应地,出现深拷贝

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

举例:

import copy
b=copy.deepcopy(a)
a[3].append('f')
printab(a[3],b[3])
printab(a,b)

结果:

['a', 'b', 'c', 'f']
['a', 'b', 'c']
2032130614216
2032131184392
[1, 2, 3, ['a', 'b', 'c', 'f'], 4]
[1, 2, 3, ['a', 'b', 'c'], 4]
2032131138248
2032131175560

结果显而易见。

如果读者有收获或者有问题,欢迎点赞或者评论,谢谢。
    python:190341254
丁。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值