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的urllib模块显示下载进度示例
Jan 17 Python
python的re模块应用实例
Sep 26 Python
python动态参数用法实例分析
May 25 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
Tensorflow 查看变量的值方法
Jun 14 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 Python
Python实现数据的序列化操作详解
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 字符串操作入门教程
2006/12/06 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
JavaScript修改css样式style
2008/04/15 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
react-router实现按需加载
2017/05/09 Javascript
js断点调试经验分享
2017/12/08 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
详解Python装饰器由浅入深
2016/12/09 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
wxPython多个窗口的基本结构
2019/11/19 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
python 求10个数的平均数实例
2019/12/16 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
酒店管理专业自荐信
2014/05/23 职场文书
民事授权委托书范文
2014/08/02 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
《叶问2》观后感
2015/06/15 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
小学美术教学反思
2016/02/17 职场文书