在Python里的赋值语句是不拷贝对象的,它只是让目标和对象之间进行绑定。对于一些可变的容器来说,有时需要修改容器的内容,但不影响之前的对象。因此本模块提供了简单拷贝和深度拷贝对象的功能。
copy.copy(x)
返回一个简单拷贝的对象。
例子:
#python 3.4
import copy
l = [2, 4]
x = copy.copy(l)
print(x)
结果输出如下:
[2, 4]
copy.deepcopy(x)
返回一个深度拷贝的对象。
例子:
#python 3.4
import copy
l = [2, 4]
x = copy.deepcopy(l)
print(x)
结果输出如下:
[2, 4]
exception copy.error
抛出模块指定的异常。
在简单拷贝和深度拷贝对于复杂的可变对象(比如列表里包括列表,字典里包括列表)是不一样的处理:
l 简单拷贝的处理:构造一个新的复合对象,然后原来对象的引用增加,然后放到复合对象里。
l 深度拷贝的处理:构造一个新的复合对象,然后递归地拷贝内部包含的对象到复合对象里。
深度拷贝比简单拷贝存在两个比较大的问题:
l 递归对象时会出现死循环,比如复合对象里直接或间接地相互引用。
l 由于深度拷贝会拷贝所有数据,即使共享的管理结构的数据也会拷贝。
因此深度拷贝函数deepcopy()为会避免上面的问题,采用下面的方法来处理:
l 保持一个标记字典来指示那一个对象已经拷贝过。
l 由用户来自定义一个拷贝函数或者设置复合对象的拷贝。
本模块不会拷贝的类型:模块、方法、栈跟踪、运行框架、文件、网络socket、窗口、数组或简单类型。同时不会拷贝函数和类,保持原来的对象不变,与模块pickle保持一致。
简单拷贝时,对于字典可以使用dict.copy()拷贝,对于列表可以使用切割方法:copied_list = original_list[:]。
例子:
#python 3.4
import copy
l = [2, 4, ['a', 'b']]
x = copy.deepcopy(l)
y = copy.copy(l)
print('deepcopy:', x, 'copy:', y)
l[2][0] = 'c'
print('deepcopy:', x, 'copy:', y)
结果输出如下:
deepcopy: [2, 4, ['a', 'b']] copy: [2, 4, ['a', 'b']]
deepcopy: [2, 4, ['a', 'b']] copy: [2, 4, ['c', 'b']]
蔡军生 QQ:9073204 深圳