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