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的Django框架上部署ORM库的教程
Apr 20 Python
Python实现统计单词出现的个数
May 28 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
python类中super()和__init__()的区别
Oct 18 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
python实现windows壁纸定期更换功能
Jan 21 Python
详解Python3中ceil()函数用法
Feb 19 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
基于Python快速处理PDF表格数据
Jun 03 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
Angular工具方法学习
2016/12/26 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
python实现RSA加密(解密)算法
2016/02/17 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
Hibernate持久层技术
2013/12/16 面试题
会展策划与管理专业求职信
2014/06/09 职场文书
六查六看自查报告
2014/10/14 职场文书
综合素质评价自我评价
2015/03/06 职场文书
html中两种获取标签内的值的方法
2022/06/16 jQuery