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通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
Python文件读写保存操作的示例代码
Sep 14 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
python保留小数位的三种实现方法
Jan 07 Python
详解python中的闭包
Sep 07 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 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解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
JavaScript效率调优经验
2009/06/04 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
Python实现的二维码生成小软件
2014/07/11 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
环境科学专业研究生求职信
2013/10/02 职场文书
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
金融专业求职信
2014/08/05 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
检讨书范文1000字
2015/01/28 职场文书
避暑山庄导游词
2015/02/04 职场文书
《失物招领》教学反思
2016/02/20 职场文书
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL
Python中的程序流程控制语句
2022/02/24 Python
python开发人人对战的五子棋小游戏
2022/05/02 Python