5.7 copy--简单拷贝和深度拷贝对象

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  深圳

你可能感兴趣的:(python,对象,milang)