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的三目运算符和not in运算符使用示例
Mar 03 Python
python之Socket网络编程详解
Sep 29 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
python 批量修改 labelImg 生成的xml文件的方法
Sep 09 Python
python 用opencv实现霍夫线变换
Nov 27 Python
浅谈Python协程asyncio
Jun 20 Python
Python中的pprint模块
Nov 27 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学习笔记之 函数声明
2011/06/09 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python正则表达式完全指南
2017/05/25 Python
详解python中asyncio模块
2018/03/03 Python
Python多图片合并PDF的方法
2019/01/03 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
《天安门广场》教学反思
2014/04/23 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
小学教师个人总结
2015/02/05 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
Hive常用日期格式转换语法
2022/06/25 数据库