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关闭windows进程的方法
Apr 18 Python
Python调用C++,通过Pybind11制作Python接口
Oct 16 Python
python3爬虫怎样构建请求header
Dec 23 Python
人工神经网络算法知识点总结
Jun 11 Python
python实现串口自动触发工作的示例
Jul 02 Python
Python异常处理例题整理
Jul 07 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
Django中ORM的基本使用教程
Dec 22 Python
bat批处理之字符串操作的实现
Mar 16 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中其实也可以用方法链
2011/11/10 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
Python的标准模块包json详解
2017/03/13 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
pandas分组聚合详解
2020/04/10 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
new修饰符是起什么作用
2015/06/28 面试题
自我鉴定书范文
2013/10/02 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
商超业务员岗位职责
2014/03/12 职场文书
2014年绿化工作总结
2014/12/09 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL