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判断字符串是否包含子字符串的方法
Mar 24 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
python计算圆周率pi的方法
Jul 11 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
微信跳一跳小游戏python脚本
Jan 05 Python
python语言中with as的用法使用详解
Feb 23 Python
python opencv 图像拼接的实现方法
Jun 27 Python
Django 批量插入数据的实现方法
Jan 12 Python
详解Python IO口多路复用
Jun 17 Python
pytorch中的model=model.to(device)使用说明
May 24 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
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
document.all与WEB标准
2020/05/13 Javascript
DHTML 中的绝对定位
2006/11/26 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
Python实现学生成绩管理系统
2020/04/05 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2014年药店工作总结
2014/11/20 职场文书
任命书标准格式
2015/03/02 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
队列队形口号
2015/12/25 职场文书
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL