copy

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,不是改变这个对象)。

如果是自定义的类,可以通过定义copydeepcopy来实现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

你可能感兴趣的:(copy)