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 相关文章推荐
Python里disconnect UDP套接字的方法
Apr 23 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Python内置模块logging用法实例分析
Feb 12 Python
python八皇后问题的解决方法
Sep 27 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
总结python中pass的作用
Feb 27 Python
python tkinter组件使用详解
Sep 16 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
python 图像增强算法实现详解
Jan 24 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&&mysql)三
2006/10/09 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python计算一个序列的平均值的方法
2015/07/11 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python 使用office365邮箱的示例
2020/10/29 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
《春笋》教学反思
2014/04/15 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android