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 fileinput模块使用介绍
Nov 30 Python
Python读写配置文件的方法
Jun 03 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
对Python3 序列解包详解
Feb 16 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
django foreignkey(外键)的实现
Jul 29 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
python保存log日志,实现用log日志画图
Dec 24 Python
python实现串口通信的示例代码
Feb 10 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
python运算符之与用户交互
Apr 13 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
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
js实现移动端轮播图
2020/12/21 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
PyQT实现多窗口切换
2018/04/20 Python
详解Python绘图Turtle库
2019/10/12 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
求职信格式范本
2013/11/15 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL