[Python]Python中的浅复制与深复制

时间:2022-06-03 04:04:08

看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制。

test了一下,发现确实如果a中存在可变对象,如list/set/dict等,则对原对象的修改,会影响到copy过来的值。

a = [{1,2,3}, 1,2]
b = a[:]
# 修改不可变对象
a[2] = 3
a # > [{1, 2, 3}, 1, 3]
b # > [{1, 2, 3}, 1, 2]
# 修改可变对象
a[0].add(4)
a # > [{1, 2, 3, 4}, 1, 3]
b # > [{1, 2, 3, 4}, 1, 2]

深复制/浅复制的说明可以参考这里:http://www.cnblogs.com/wilber2013/p/4645353.html

可以只看总结:

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

Python中对象的赋值都是进行对象引用(内存地址)传递
使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说
如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子