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中return语句用法实例分析
Aug 04 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
python实现BackPropagation算法
Dec 14 Python
PyQt实现界面翻转切换效果
Apr 20 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
基于python的列表list和集合set操作
Nov 24 Python
python 实现生成均匀分布的点
Dec 05 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
vscode调试django项目的方法
Aug 06 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
Python聊天室实例程序分享
2016/01/05 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
中英文自我评价语句
2013/12/20 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
总结几个非常实用的Python库
2021/06/26 Python