python中引用与复制用法实例分析


Posted in Python onJune 04, 2015

本文实例讲述了python中引用与复制用法。分享给大家供大家参考。具体分析如下:

在python中,任何不可变对象是传值的,而可变对象是传引用的。

不管是向函数传递参数或者是任何形式的对象复制来说,不可变对象(比如整数,字符串)被真正复制,而可变对象只是复制了一个对他们的引用,即在内存中只有一份对象,而引用两份。
 
a=b 这样的赋值,就会创建对b的引用,对于象数字和字符串这样的不可变的对象,这种赋值实际是创建了b的一个副本

>>> a='hello'
>>> b=a
>>> id(a)
29326432
>>> id(b)
29326432
>>> b is a
True
>>> a=1000
>>> b
'hello'

对于可变对象,比如字典和列表,a和b引用的是同一个对象,修改其中任意一个变量都会影响到另一个。

>>> a=[1,2,3,4]
>>> b=a
>>> id(a)
29280896
>>> id(b)
29280896
>>> b[3]='ccccccccc'
>>> a
[1, 2, 3, 'ccccccccc']
>>>

列表和字典这样的容器对象,可以使用两种赋值操作:浅复制和深复制。浅复制创建一个新对象,但它包含的是对原始对象中包含的项的引用。

比如下面的浅复制:

>>> a=[1,2,3,4,[9,0]]
>>> b=a
>>> a=[1,2,3,4,[9,0]]
>>> b=list(a)
>>> b is a
False
>>> b[0]=1000
>>> b
[1000, 2, 3, 4, [9, 0]] #注意,b修改了b[0]以后,对a没有影响
>>> a
[1, 2, 3, 4, [9, 0]]
>>> b[4][1]='cccc'  #注意,b修改了 b[4][1]以后,对a有影响
>>> b
[1000, 2, 3, 4, [9, 'cccc']]
>>> a
[1, 2, 3, 4, [9, 'cccc']]

深复制将创建一个新对象,并且递归的复制它包含的所有对象,没有内置对象可以创建深复制,可以使用copy.deepcopy()函数完成。

>>> import copy
>>> a=[1,2,3,[4,5]]
>>> b=copy.deepcopy(a)
>>> id(b)
29582240    
>>> id(a)
29581840
>>> a is b
False
>>> b[0]=1000
>>> b
[1000, 2, 3, [4, 5]] #注意修改了b[0]之后对a没有影响
>>> a
[1, 2, 3, [4, 5]]
>>> b[3][1]='gggg'
>>> b
[1000, 2, 3, [4, 'gggg']] #修改了 b[3][1]之后对a也没有影响,这是和浅复制的区别
>>> a
[1, 2, 3, [4, 5]]

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python中mechanize库的简单使用示例
Jan 10 Python
Python help()函数用法详解
Mar 11 Python
Python实现控制台输入密码的方法
May 29 Python
python八大排序算法速度实例对比
Dec 06 Python
Python实现带参数与不带参数的多重继承示例
Jan 30 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
Python进程间通信用法实例
Jun 04 #Python
python中__slots__用法实例
Jun 04 #Python
python协程用法实例分析
Jun 04 #Python
Python获取系统默认字符编码的方法
Jun 04 #Python
python中__call__内置函数用法实例
Jun 04 #Python
python抽象基类用法实例分析
Jun 04 #Python
python基于multiprocessing的多进程创建方法
Jun 04 #Python
You might like
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
Python socket聊天脚本代码实例
2020/01/02 Python
NumPy统计函数的实现方法
2020/01/21 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
施工协议书范本
2014/04/22 职场文书
2014年师德承诺书
2014/05/23 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
教师个人成长总结
2015/02/11 职场文书
西安事变观后感
2015/06/12 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL