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实现的堆排序算法示例
Apr 29 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
Python数据类型之Number数字操作实例详解
May 08 Python
详解Python 切片语法
Jun 10 Python
python实现点击按钮修改数据的方法
Jul 17 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python数据类型可变不可变知识点总结
Mar 06 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
python实现层次聚类的方法
Nov 01 Python
python标准库ElementTree处理xml
May 20 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目录管理函数小结
2008/09/10 PHP
curl和libcurl的区别简介
2015/07/01 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
javascript 面向对象编程基础:继承
2009/08/21 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
在python 不同时区之间的差值与转换方法
2019/01/14 Python
python基于SMTP协议发送邮件
2019/05/31 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
美国社交购物市场:MassGenie
2019/02/18 全球购物
华为c/c++笔试题
2016/01/25 面试题
市场营销大学生职业规划书
2014/02/25 职场文书
人事专员的岗位职责
2014/03/01 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL