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解析xml文件实例分享
Dec 04 Python
python通过socket查询whois的方法
Jul 18 Python
利用python获取Ping结果示例代码
Jul 06 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python箱型图处理离群点的例子
Dec 09 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
python flask框架快速入门
May 14 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php实现字符串翻转的方法
2015/03/27 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
PHP中串行化用法示例
2016/11/16 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
PHP7 windows支持
2021/03/09 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
python访问sqlserver示例
2014/02/10 Python
python中from module import * 的一个坑
2014/07/20 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
python字典快速保存于读取的方法
2018/03/23 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
酒后驾驶检讨书
2014/01/27 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
储备店长岗位职责
2015/04/14 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL