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

来源:互联网 发布:linux ping大包命令 编辑:程序博客网 时间:2024/05/17 21:45

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]29670549347282967054981064[1, 2, 3, ['a', 'b', 'c', 's'], 4][1, 2, 3, ['a', 'b', 'c', 's'], 4]29670549347282967054981064

浅拷贝

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

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

b=aprintab(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]24963544112082496354411208[1, 2, 3, ['a', 'b', 'c'], 4, 5][1, 2, 3, ['a', 'b', 'c'], 4, 5]24963544112082496354411208[1, 2, 3, ['a', 'b', 'c'], 4, 5, 6][1, 2, 3, ['a', 'b', 'c'], 4, 5, 6]24963544112082496354411208
显然可以理解,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]25496847244242549684770760

但是,如果存在可变元素如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']19895187793361989518779336[1, 2, 3, ['a', 'b', 'c', 'd'], 4][1, 2, 3, ['a', 'b', 'c', 'd'], 4]19895203519441989520398280

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

于是相应地,出现深拷贝

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

举例:

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

结果:

['a', 'b', 'c', 'f']['a', 'b', 'c']20321306142162032131184392[1, 2, 3, ['a', 'b', 'c', 'f'], 4][1, 2, 3, ['a', 'b', 'c'], 4]20321311382482032131175560

结果显而易见。

如果读者有收获或者有问题,欢迎点赞或者评论,谢谢。    python:190341254丁。
原创粉丝点击