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数据类型转换函数总结
Mar 11 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
Python实现豆瓣图片下载的方法
May 25 Python
Python中正则表达式详解
May 17 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python找出完数的方法
Nov 12 Python
详解django中url路由配置及渲染方式
Feb 25 Python
Python实现数值积分方式
Nov 20 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 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 常用类汇总 推荐收藏
2010/05/13 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
js验证表单大全
2006/11/25 Javascript
兼容ie和firefox js关闭代码
2008/12/11 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
python实现扫描日志关键字的示例
2018/04/28 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
先进德育工作者事迹材料
2014/01/24 职场文书
舞出我人生观后感
2015/06/16 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记