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 切片和range()用法说明
Mar 24 Python
Python中常见的数据类型小结
Aug 29 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Django Highcharts制作图表
Aug 27 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
Python AES加密实例解析
Jan 18 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
python tkinter实现屏保程序
Jul 30 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
Python Django搭建文件下载服务器的实现
May 10 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
图书管理程序(一)
2006/10/09 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PHP培训要多少钱
2017/06/06 PHP
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
Python3.6正式版新特性预览
2016/12/15 Python
python 命令行传入参数实现解析
2019/08/30 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
Python实现简单的2048小游戏
2021/03/01 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
工业设计专业个人求职信范文
2013/12/28 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
2015年复活节活动总结
2015/02/27 职场文书
员工表扬信怎么写
2015/05/05 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript