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检测远程udp端口是否打开的方法
Mar 14 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
Python教程之全局变量用法
Jun 27 Python
python 打印对象的所有属性值的方法
Sep 11 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
Python中的Numpy矩阵操作
Aug 12 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
Python实现自定义读写分离代码实例
Nov 16 Python
sklearn+python:线性回归案例
Feb 24 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 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 empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP制作用户注册系统
2015/10/23 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
javascript基本语法分析说明
2008/06/15 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
使用python 获取进程pid号的方法
2014/03/10 Python
Python中__name__的使用实例
2015/04/14 Python
python数据结构之图的实现方法
2015/07/08 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
pymysql的简单封装代码实例
2020/01/08 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
IBatis持久层技术
2016/07/18 面试题
六一儿童节活动策划方案
2014/01/27 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
Python中三种花式打印的示例详解
2022/03/19 Python