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判断windows隐藏文件的方法
Mar 21 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Python基础之文件读取的讲解
Feb 16 Python
Python同步遍历多个列表的示例
Feb 19 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python3 下载网络图片代码实例
Aug 27 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
python怎么删除缓存文件
Jul 19 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 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
模仿OSO的论坛(一)
2006/10/09 PHP
PHP 变量类型的强制转换
2009/10/23 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
jQuery功能函数详解
2015/02/01 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
JScript实现地址选择功能
2017/08/15 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
django settings.py 配置文件及介绍
2019/07/15 Python
用python实现学生管理系统
2020/07/24 Python
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
法学个人求职信范文
2014/01/27 职场文书
申报优秀教师材料
2014/12/16 职场文书
小马王观后感
2015/06/11 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP