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 相关文章推荐
python3.5实现socket通讯示例(TCP)
Feb 07 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
python输出决策树图形的例子
Aug 09 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
Python爬取12306车次信息代码详解
Aug 12 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开发框架Laravel数据库操作方法总结
2014/09/03 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
webpack多页面开发实践
2017/12/18 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
Python实现获取某天是某个月中的第几周
2015/02/11 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
Django组件content-type使用方法详解
2019/07/19 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
全国道德模范事迹
2014/02/01 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
工作所在部门证明
2014/09/21 职场文书
2014年科技工作总结
2014/11/26 职场文书
师德标兵事迹材料
2014/12/19 职场文书
催款函范文
2015/06/24 职场文书