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的Flask框架中实现分页功能的教程
Apr 20 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
python实现两个文件合并功能
Apr 01 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
python IDLE添加行号显示教程
Apr 25 Python
Python实现初始化不同的变量类型为空值
Jun 02 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
用python实现监控视频人数统计
May 21 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调用Twitter的RSS的实现代码
2010/03/10 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python检测网络延迟的代码
2018/05/15 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
大学毕业生自我鉴定
2013/11/05 职场文书
应届医学毕业生求职信分享
2013/12/02 职场文书
趣味体育活动方案
2014/02/08 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
考试保密承诺书
2014/08/30 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
2014年电厂工作总结
2014/12/04 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
同乡会致辞
2015/07/30 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫