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实现多线程下载文件的代码实例
Jun 01 Python
让 python 命令行也可以自动补全
Nov 30 Python
Python编程中的异常处理教程
Aug 21 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
python Django中models进行模糊查询的示例
Jul 18 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
十幅图告诉你什么是PHP引用
2015/02/22 PHP
php提高网站效率的技巧
2015/09/29 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
JavaScript实现短信倒计时60s
2017/10/09 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
Python修改Excel数据的实例代码
2013/11/01 Python
浅谈Python数据类型之间的转换
2016/06/08 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
python 实现音频叠加的示例
2020/10/29 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
自荐信写法介绍
2014/01/25 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
python 进阶学习之python装饰器小结
2021/09/04 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
Golang 实现WebSockets
2022/04/24 Golang