5.7 copy--简单拷贝和深度拷贝对象
2016-01-23 21:54
190 查看
在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 深圳
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 深圳
相关文章推荐
- APACHE服务器500错误解决方法
- nginx服务器中的安全配置
- linux下向yeelink添加数据点
- Linux CentOS 7.0 下 rar unrar的安装
- Linux下使用codeblocks交叉编译ARM-LINUX-GCC程序
- 关于iTop4412启动指导
- Linux 学习笔记 gcc简单了解
- Linux学习笔记2016/1/23 CRT配置及VI相关
- Linux 创建 idea启动图标
- Hadoop_1: wordcount
- linux命令学习之(tail)
- 绕过安全狗狗的WebShell for PHP
- 生产场景不同角色linux服务器分区案例
- redhat7.2配置centos的yum源 并挂载nfts
- SSH之Tomcat环境配置
- php.ini+apache配置(持续更新)
- PAT 1044. Shopping in Mars
- linux terminal theme
- 关于乌班图基础的linux命令1
- Linux下Openssl的安装全过程