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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
Python二维码生成识别实例详解
Jul 16 Python
详解Python二维数组与三维数组切片的方法
Jul 18 Python
基于python操作ES实例详解
Nov 16 Python
Python二次规划和线性规划使用实例
Dec 09 Python
python中format函数如何使用
Jun 22 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
用 Python 元类的特性实现 ORM 框架
May 19 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php生成短网址示例
2014/05/05 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
smarty中常用方法实例总结
2015/08/07 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
python实现门限回归方式
2020/02/29 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
性能服装:HYLETE
2018/08/14 全球购物
二手房购房意向书范本
2014/04/01 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
秦兵马俑导游词
2015/02/02 职场文书
综合测评个人总结
2015/03/03 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
学校工会工作总结2015
2015/05/19 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis