copy.copy()
copy.deepcopy()
这边的浅拷贝和深拷贝只有在复合类型(包含其他对象的)情况有意义:
浅拷贝中对包含的对象插入引用
深拷贝会迭代得构造新的对象
对于深拷贝,如果有指向自身的引用,会导致循环;会拷贝所有的,即使是应该在copy之间共享的管理信息等。解决方案:
维持一个memo dict来保存已经复制过的对象
提供了用户改写复制过程的方法
局限
不复制module、method、stack trace、stack frame、file、socket、window、array,只是返回原来的东西。
对于字典可以直接调用他的dict.copy()方法来进行浅拷贝,对于list可以调用list[:]来进行浅拷贝;可以调用list(l1),如果l1是一个list则这样调用会返回一个l1的拷贝(就像是传递进来一个可迭代的对象,只是根据这个对象构建list,不是改变这个对象)。
如果是自定义的类,可以通过定义copy,deepcopy来实现copy功能,deepcopy可以接受一个参数(memo),是用于解决深拷贝的问题:
def __copy__(self):
return self.__class__([
(k, v[:])
for k, v in self.lists()
])
def __deepcopy__(self, memo=None):
if memo is None:
memo = {}
result = self.__class__()
memo[id(self)] = result
for key, value in dict.items(self):
dict.__setitem__(result, copy.deepcopy(key, memo),
copy.deepcopy(value, memo))
return result