Python中的复制操作及copy模块中的浅拷贝与深拷贝方法


Posted in Python onJuly 02, 2016

程序中常常需要复制一个对象, 按思路应该是这样的

a = [1, 2, 3]
b = a

# [1, 2, 3]
print b

已经复制好了,但是现在得改变一下第一个元素的值把它改成5

b[0] = 5 

# [5, 2, 3]
print b 

# [5, 2, 3]
print a

我改变了b的第一个元素的值,但是a的值也改变了,这是因为python中的=是引用.a和b指向的是相同的列表,所以改变列表会出现以上的结果.

解决方法是切片操作

a = [1, 2, 3]
b = a[:]
b[0] = 4

# [1, 2, 3]
# [4, 2, 3]
print a
print b

但是在嵌套列表的时候呢,试一试

a = [[1,2,3], 4, 5]
b = a[:]
b[1] = 0 

# [[1,2,3], 4, 5]
# [[1,2,3], 0, 5]
print a
print b

恩!没什么问题,在试一试嵌套列表元素

a = [[1,2,3], 4, 5]
b = a[:]
b[0][0] = 5

# [[5,2,3], 4, 5]
# [[5,2,3], 4, 5]
print a
print b
b = a[:]

a的值还是改变了,切片复制只对该对象进行拷贝不会对子元素进行拷贝

copy 模块

copy模块用于对象的拷贝操作。该模块非常简单,只提供了两个主要的方法: copy.copy 与 copy.deepcopy ,分别表示浅复制与深复制。什么是浅复制,什么是深复制,网上有一卡车一卡车的资料,这里不作详细介绍。复制操作只对复合对象有效。用简单的例子来分别介绍这两个方法。

浅复制只复制对象本身,没有复制该对象所引用的对象。

#coding=gbk
import copy
l1 = [1, 2, [3, 4]]
l2 = copy.copy(l1)
print l1
print l2
l2[2][0] = 50
print l1
print l2

结果:

[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [50, 4]]
[1, 2, [50, 4]]

同样的代码,使用深复制,结果就不一样:

import copy
l1 = [1, 2, [3, 4]]
l2 = copy.deepcopy(l1)
print l1
print l2
l2[2][0] = 50
print l1
print l2

结果:

[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [50, 4]]

改变copy的默认行为

在定义类的时候,通过定义__copy__和__deepcopy__方法,可以改变copy的默认行为。下面是一个简单的例子:

class CopyObj(object):
  def __repr__(self):
    return "CopyObj"
  
  def __copy__(self):
    return "Hello"
obj = CopyObj()
obj1 = copy.copy(obj)
print obj
print obj1

结果:

CopyObj
Hello
Python 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
python的Tqdm模块的使用
Jan 10 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Django DRF路由与扩展功能的实现
Jun 03 Python
Pycharm安装python库的方法
Nov 24 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 #Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 #Python
Python之父谈Python的未来形式
Jul 01 #Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 #Python
Python内置数据结构与操作符的练习题集锦
Jul 01 #Python
Python设置默认编码为utf8的方法
Jul 01 #Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 #Python
You might like
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
用JS实现选项卡
2020/03/23 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
python微信好友数据分析详解
2018/11/19 Python
pip安装python库的方法总结
2019/08/02 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Python requests上传文件实现步骤
2020/09/15 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
nohup的用法
2014/08/10 面试题
JSF界面控制层技术
2013/06/17 面试题
关于幼儿的自我评价
2013/12/18 职场文书
机电系毕业生求职信
2014/07/11 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
珍爱生命主题班会
2015/08/13 职场文书
《雷雨》教学反思
2016/02/20 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
Python 中random 库的详细使用
2021/06/03 Python