举例区分Python中的浅复制与深复制


Posted in Python onJuly 02, 2015

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除法运算小技巧
Apr 05 Python
python变量不能以数字打头详解
Jul 06 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
python读取中文txt文本的方法
Apr 12 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python操作redis数据库的三种方法
Sep 10 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
Python中time标准库的使用教程
Apr 13 Python
Python多进程机制实例详解
Jul 02 #Python
Python回调函数用法实例详解
Jul 02 #Python
在Python中marshal对象序列化的相关知识
Jul 01 #Python
python保存字符串到文件的方法
Jul 01 #Python
python选择排序算法实例总结
Jul 01 #Python
python实现的希尔排序算法实例
Jul 01 #Python
python获取一组汉字拼音首字母的方法
Jul 01 #Python
You might like
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
python实现画图工具
2020/08/27 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
客服实习的个人自我鉴定
2013/10/20 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
员工工作表扬信范文
2014/01/13 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
解除劳动合同协议书
2014/09/17 职场文书
士兵突击观后感
2015/06/16 职场文书
信息技术课教学反思
2016/02/23 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
PHP设计模式(观察者模式)
2021/07/07 PHP