看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()进行深拷贝 对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子