python中的对象拷贝示例 python引用传递


Posted in Python onJanuary 23, 2014

何谓引用传递,我们来看一个C++交换两个数的函数:

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

这个例子就是一个引用传递的例子!目的是说明一下概念:引用传递的意思就是说你传递的是对象的引用,对这个引用的修改也会导致原有对象的改变。学过C/C++的朋友们都知道,在交换2个数的时候,如果自己实现一个swap函数,需要传递其引用或者指针。

Python直接使用引用传递,多方便啊,你还要吐槽什么?你又想过我不想改变原对象的情况吗?如果有,那么看这里!

假设我现在有一个list,叫做l1,我现在需要一份l1的拷贝,如果我直接使用诸如l2 = l1的方式,然后我对l2进行一系列的修改,会等价于我对l1直接做修改,这可不是我想要的!如:

l1 = [1, 2]
l2 = l1
l2.append(3)
print l1
print l2
# l1 = [1, 2, 3], l2 = [1, 2, 3]

这就是Python引用传递造成的,也就是说l1和l2属于同一list对象,那么如何才能得到一份不同的对象呢?这不是so easy嘛,用切片撒,比如:

l1 = [1, 2]
l2 = l1[:]
l2.append(3)
# l1 = [1, 2], l2 = [1, 2, 3]

是的,目的达到了,别介,你确定这样一定行?让我们看看一个更复杂的情况:

l1 = [[1, 2], 3]
l2 = l1[:]
l2.append(4)
# l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4]
l2[0].append(5)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]

啊哈,貌似出问题了哈,这个可不是我们需要的!怎么办呢?好了,进入今天的正题,Python中的copy模块!

import copy

如果你希望复制一个容器对象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,这个方法会消耗一些时间和空间,不过,如果你需要完全复制,这是唯一的方法。上面我们提到的切片的方式,等价于copy模块中的copy函数。

上面拷贝的操作变得so easy了:

l1 = [[1, 2], 3]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
l2.append(4)
l2[0].append(5)
l3[0].append(6)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]

相关说明:

copy(x) 
    Shallow copy operation on arbitrary Python objects. 
    See the module's __doc__ string for more info. 
deepcopy(x, memo=None, _nil=[]) 
    Deep copy operation on arbitrary Python objects. 
    See the module's __doc__ string for more info.
Python 相关文章推荐
从Python的源码来解析Python下的freeblock
May 11 Python
Python解析最简单的验证码
Jan 07 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
python 命令行传入参数实现解析
Aug 30 Python
如何使用python传入不确定个数参数
Feb 18 Python
python实现简单颜色识别程序
Feb 19 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 20 Python
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 #Python
python使用scrapy解析js示例
Jan 23 #Python
php使用递归与迭代实现快速排序示例
Jan 23 #Python
python实现批量转换文件编码(批转换编码示例)
Jan 23 #Python
python写的一个文本编辑器
Jan 23 #Python
python生成指定长度的随机数密码
Jan 23 #Python
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 #Python
You might like
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
pandas重新生成索引的方法
2018/11/06 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
经典c++面试题二
2015/08/14 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
求职者简历中的自我评价
2013/10/20 职场文书
函授自我鉴定
2013/11/06 职场文书
店长职务说明书
2014/02/04 职场文书
安全生产汇报材料
2014/02/17 职场文书
节约用电标语
2014/06/17 职场文书
庐山导游词
2015/02/03 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
MySQL系列之十二 备份与恢复
2021/07/02 MySQL