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
丁。