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中的一些类型转换函数小结
Feb 10 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
详解python中asyncio模块
Mar 03 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
PyQt弹出式对话框的常用方法及标准按钮类型
Feb 27 Python
解决python flask中config配置管理的问题
Jul 26 Python
python中文分词库jieba使用方法详解
Feb 11 Python
Python实现一个优先级队列的方法
Jul 31 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
javascript中常用编程知识
2013/04/08 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
Python新手如何理解循环加载模块
2020/05/29 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
寒暑假实习证明书模板
2014/11/29 职场文书
音乐课外活动总结
2015/05/09 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers