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发送伪造的arp请求
Jan 09 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
利用Python如何生成便签图片详解
Jul 09 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python for循环remove同一个list过程解析
Aug 14 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
关于python中导入文件到list的问题
Oct 31 Python
4种非常实用的python内置数据结构
Apr 28 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
JS中的phototype详解
2017/02/04 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
python检测是文件还是目录的方法
2015/07/03 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
创先争优活动方案
2014/02/12 职场文书
护士医德医风自我评价
2014/09/15 职场文书
委托书的写法
2014/09/16 职场文书
加强作风建设工作总结
2014/10/23 职场文书
八一建军节慰问信
2015/02/14 职场文书
二十年同学聚会感言
2015/07/30 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏