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数据类型学习笔记
Jan 13 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
python 实现调用子文件下的模块方法
Dec 07 Python
Python如何将函数值赋给变量
Apr 28 Python
Python 如何定义匿名或内联函数
Aug 01 Python
Python实现AES加密,解密的两种方法
Oct 03 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数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
一个简单的php路由类
2016/05/29 PHP
[原创]图片分页查看
2006/08/28 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
升旗仪式主持词
2014/03/19 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
个人工作总结范文2014
2014/11/07 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL