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 dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
解决uWSGI的编码问题详解
Mar 24 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
Python并行分布式框架Celery详解
Oct 15 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
基于python实现上传文件到OSS代码实例
May 09 Python
python常量折叠基础知识点讲解
Feb 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
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
php语法检查的方法总结
2019/01/21 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python迭代用法实例教程
2014/09/08 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
django连接oracle时setting 配置方法
2019/08/29 Python
python实现贪吃蛇双人大战
2020/04/18 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
实习老师离校感言
2014/02/03 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
北京奥运会口号
2014/06/21 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
2014年招生工作总结
2014/11/26 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书