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使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
Python 实现数据结构中的的栈队列
May 16 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
django 装饰器 检测登录状态操作
Jul 02 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
python-for x in range的用法(注意要点、细节)
May 10 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP print类函数使用总结
2010/06/25 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
Javascript连接Access数据库完整实例
2015/08/03 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python利用Guetzli批量压缩图片
2017/03/23 Python
python简单实现操作Mysql数据库
2018/01/29 Python
python实现按首字母分类查找功能
2019/10/31 Python
python使用建议与技巧分享(一)
2020/08/17 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
英文留学推荐信范文
2014/01/25 职场文书
卫生安全检查制度
2014/02/04 职场文书
优秀求职信
2014/05/29 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
国庆横幅标语
2014/10/08 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
检讨书范文1000字
2015/01/28 职场文书
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL