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提取html文件中的特定数据的实现代码
Mar 24 Python
Python实现多线程下载文件的代码实例
Jun 01 Python
python中的set实现不重复的排序原理
Jan 24 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
在django模板中实现超链接配置
Aug 21 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
使用Python pip怎么升级pip
Aug 11 Python
如何基于Python实现word文档重新排版
Sep 29 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 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
Banner程序
2006/10/09 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
详解用python生成随机数的几种方法
2019/08/04 Python
Python序列类型的打包和解包实例
2019/12/21 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
门诊手术室工作制度
2014/01/30 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
机电一体化求职信
2014/03/10 职场文书
岗位说明书标准范本
2014/07/30 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
文明单位汇报材料
2014/12/24 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
Java 数组的使用
2022/05/11 Java/Android