Python‘==‘ 及 ‘is‘相关原理解析


Posted in Python onSeptember 05, 2020

'==' 比较的是两个对象的值

'is' 比较的是两个对象的内存地址(id)

下面我们着重理解 'is'。对于这个,我们需要知道:小整数对象池,大整数对象池,以及intern机制

小整数池:Python预先创建小整数缓存池—— [-5~256],无论创建多少个对象,都是指向同一个地址,这样是为了避免小整数频繁申请和释放内存。

>>> a=3
>>> b=3
>>> a is b
True
>>> 1+2 is 3
True

>>> a=1.0
>>> b=1.0
>>> a is b
False

大整数对象池:Python 提供了一个可扩展的内存空间,也叫通用整数对象池,谁需要用就给谁用,免去了申请内存。这个空间是一个PyIntBlock结构,是用一个单向列表连接一串内存(block),这个列表由 block_list 维护,而每个 block 维护一个 整数对象数组(Objects),用于存放被缓存的整数对象,即处于一个内存(block)的大整数是同一个对象。

>>> def func():
... a=10.1
... b=10.1
... return a is b
...
>>> func()
True

a和b的赋值都是由同一个通用整数池项获得的。

intern机制:Python的字符串类型中有一个 interned,它是一个记录字符串对象的字典,以此来保证这些字符串在内存中的唯一,相同值的字符串会使用同一个对象。

但是,只对由字母、数字、下划线组成的字符串做intern处理,而存在其他字符的字符串则不会。

>>> a='abc'
>>> b='abc'
>>> a is b
True

>>> a='ab c'
>>> b='ab c'
>>> a is b
False

此外,Python其他的数据类型如字典(dict)、列表(list)、集合(set)等,都是创建不同的对象

>>> a=[1,2,3]
>>> b=[1,2,3]
>>> a is b
False>>> a={'a':1}>>> b={'a':1}>>> a is bFalse>>>

补充一个,下面这种情况是因为上一个 [1,2,3]被回收了,在新建[4,5,6]时那片缓存又被用到了

>>> id([1,2,3]) == id([4,5,6])
True
>>> id([1,2,3])
36200264L
>>> id([4,5,6])
36200264L

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中获取网页状态码的两个方法
Nov 03 Python
详解Django中的form库的使用
Jul 18 Python
Python找出9个连续的空闲端口
Feb 01 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
python函数的5种参数详解
Feb 24 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
python 实现二维列表转置
Dec 02 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
python中如何对多变量连续赋值
Jun 03 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 #Python
Python filter()及reduce()函数使用方法解析
Sep 05 #Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 #Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 #Python
Python实现快速大文件比较代码解析
Sep 04 #Python
基于python实现图片转字符画代码实例
Sep 04 #Python
Python HTMLTestRunner如何下载生成报告
Sep 04 #Python
You might like
用PHP实现维护文件代码
2007/06/14 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php zend解密软件绿色版测试可用
2008/04/14 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python获取网页状态码示例
2014/03/30 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
Python命令行click参数用法解析
2019/12/19 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
Python flask框架端口失效解决方案
2020/06/04 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
软件项目实施计划书
2014/05/02 职场文书
物业品质提升方案
2014/06/08 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
MySQL日期时间函数知识汇总
2022/03/17 MySQL