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中的全局变量用法分析
Jun 09 Python
python 中的int()函数怎么用
Oct 17 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
Python return语句如何实现结果返回调用
Oct 15 Python
python实现监听键盘
Apr 26 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
浅析return false的正确使用
2013/11/04 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python友情链接检查方法
2015/07/08 Python
Python使用剪切板的方法
2017/06/06 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
解决方案设计综合面试题
2015/08/31 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
会走路的树教学反思
2014/02/20 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
保研推荐信范文
2015/03/25 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
Vue如何清空对象
2022/03/03 Vue.js