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二分查找算法的递归实现方法
May 12 Python
浅谈python对象数据的读写权限
Sep 12 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
python正则表达式的使用
Jun 12 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
python 实现倒排索引的方法
Dec 25 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
python多任务之协程的使用详解
Aug 26 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
python3 字符串str和bytes相互转换
Mar 23 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写的serv-u的web申请账号的程序
2006/10/09 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
工艺工程师工作职责
2013/11/23 职场文书
校园文化标语
2014/06/18 职场文书
婚内分居协议书范文
2014/11/26 职场文书
学校教学工作总结2015
2015/05/19 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
保护动物的宣传语
2015/07/13 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android
python数字图像处理:图像简单滤波
2022/06/28 Python