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 相关文章推荐
在Linux中通过Python脚本访问mdb数据库的方法
May 06 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
numpy.where() 用法详解
May 27 Python
python创建与遍历List二维列表的方法
Aug 16 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Django框架中模型的用法
Jun 10 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音乐采集(部分代码)
2007/02/14 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python数据结构之单链表详解
2017/09/12 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Python 切分数组实例解析
2019/11/07 Python
python离线安装外部依赖包的实现
2020/02/13 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
.NET常见笔试题集
2012/12/01 面试题
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
中学生勤俭节约倡议书
2015/04/29 职场文书
小学生安全保证书
2015/05/09 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
年终工作总结范文
2019/06/20 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis