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 08 Python
Python下载懒人图库JavaScript特效
May 28 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
3分钟学会一个Python小技巧
Nov 23 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 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函数解决SQL injection
2006/12/09 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
javascript 写类方式之一
2009/07/05 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
JavaScript实现拖拽效果
2020/03/16 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
python字符串,数值计算
2016/10/05 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
pandas带有重复索引操作方法
2018/06/08 Python
python使用folium库绘制地图点击框
2018/09/21 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
环境工程专业毕业生求职信
2014/09/30 职场文书
春晚观后感
2015/06/11 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
如何用python反转图片,视频
2021/04/24 Python