浅拷贝通常只复制对象本身,而深拷贝不仅会复制对象,还会递归的复制对象所关联的对象。
copy.copy()浅拷贝,copy.deepcopy()深拷贝。
deepcopy函数的本质就是对象的一次序列化和一次反回序列化。
还可以使用copyreg.pickle模块的dumps和loads方法来自定义指定类型对象的拷贝行为。
深拷贝可能会遇到两个问题:
- 一个对象如果直接或间接的引用了自身,会导致无休止的递归拷贝。
- 深拷贝可能对多个对象共享的数据也进行拷贝。
deepcopy可以通过memo字典来保存已经拷贝过的对象,从而避免刚才所说的自引用递归问题。
参考资料:python如何拷贝一个对象