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的ORM框架SQLObject入门实例
Apr 28 Python
python中执行shell命令的几个方法小结
Sep 18 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
简单谈谈Python流程控制语句
Dec 04 Python
tensorflow中next_batch的具体使用
Feb 02 Python
Python中函数参数调用方式分析
Aug 09 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
python生成随机红包的实例写法
Sep 02 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
python查询MySQL将数据写入Excel
Oct 29 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
个人自荐信
2013/12/05 职场文书
幼儿教师国培感言
2014/02/19 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
公司合作意向书
2014/04/01 职场文书
入职担保书范文
2014/05/21 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
mysql配置SSL证书登录的实现
2021/09/04 MySQL
Python 正则模块详情
2021/11/02 Python