举例区分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 相关文章推荐
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
python3 property装饰器实现原理与用法示例
May 15 Python
python中 * 的用法详解
Jul 10 Python
Django Rest framework权限的详细用法
Jul 25 Python
pymysql 开启调试模式的实现
Sep 24 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
Python 线程池模块之多线程操作代码
May 20 Python
Python数据分析之绘图和可视化详解
Jun 02 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 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
php仿discuz分页效果代码
2008/10/02 PHP
PHP 文件类型判断代码
2009/03/13 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Django学习之文件上传与下载
2019/10/06 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
喷漆工的岗位职责
2014/03/17 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js
Golang实现可重入锁的示例代码
2022/05/25 Golang