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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
对Python中的@classmethod用法详解
Apr 21 Python
基于python requests库中的代理实例讲解
May 07 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
Pytorch 实现权重初始化
Dec 31 Python
keras使用Sequence类调用大规模数据集进行训练的实现
Jun 22 Python
Python编写nmap扫描工具
Jul 21 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
图象函数中的中文显示
2006/10/09 PHP
PHP学习之PHP运算符
2006/10/09 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
Python+Wordpress制作小说站
2017/04/14 Python
Python 含参构造函数实例详解
2017/05/25 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
八年级英语教学反思
2014/01/09 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
社区娱乐活动方案
2014/08/21 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
兴趣班停课通知
2015/04/24 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
解析python中的jsonpath 提取器
2022/01/18 Python