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

来源:互联网 发布:林原惠美 知乎 编辑:程序博客网 时间:2024/06/05 07:46

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

环境:python3.5

浅拷贝

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

举例:

a=[1,2,3,['a','b','c'],4]b=aprint(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))

结果:

39758483975848[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]39758483975848
显然可以理解,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]84978328498192

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

举例:

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

结果:

1765640817656408[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 6][1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 6, 7]1767287217673232

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

于是相应地,出现深拷贝

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

举例:

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

结果:

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

结果显而易见。

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