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使用django搭建web开发环境
Jun 09 Python
Python 列表理解及使用方法
Oct 27 Python
python添加菜单图文讲解
Jun 04 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
python之yield和Generator深入解析
Sep 18 Python
Python列表操作方法详解
Feb 09 Python
python-xpath获取html文档的部分内容
Mar 06 Python
Keras 使用 Lambda层详解
Jun 10 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
Python之matplotlib绘制折线图
Apr 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
基于PHP文件操作的详解
2013/06/05 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
解析php中memcache的应用
2013/06/18 PHP
php四种基础算法代码实例
2013/10/29 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
php压缩文件夹最新版
2018/07/18 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
js 居中漂浮广告
2010/03/21 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
python 获取网页编码方式实现代码
2017/03/11 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
房屋出售协议书
2014/04/10 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers