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中for循环的使用方法
May 14 Python
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
基于tensorflow加载部分层的方法
Jul 26 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
Python基础之高级变量类型实例详解
Jan 03 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
python 标准库原理与用法详解之os.path篇
Oct 24 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 curl的深入解析
2013/06/02 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
微信小程序实现评论功能
2018/11/28 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
Django Form常用功能及代码示例
2020/10/13 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
大学生应聘自荐信
2013/10/11 职场文书
财会自我鉴定范文
2013/12/27 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
学习之星事迹材料
2014/05/17 职场文书
质量月活动总结
2014/08/26 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
2015年财务部工作总结
2015/04/10 职场文书
学校会议通知范文
2015/04/15 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python