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文件操作,open读写文件,追加文本内容实例
Dec 14 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python实现石头剪刀布程序
Jan 20 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
浅谈Python 函数式编程
Jun 20 Python
python os模块在系统管理中的应用
Jun 22 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
python模板入门教程之flask Jinja
Apr 11 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实现的MySQL通用查询程序
2007/03/11 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python使用turtule画五角星的方法
2015/07/09 Python
详解Python自建logging模块
2018/01/29 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
如何在python中实现随机选择
2019/11/02 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
如何教少儿学习Python编程
2020/07/10 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
车间操作工岗位职责
2013/12/19 职场文书
美术毕业生求职信
2014/02/25 职场文书
美术教师岗位职责
2014/03/18 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL