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超简单解决约瑟夫环问题
May 12 Python
Python微信公众号开发平台
Jan 25 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
python中类的属性和方法介绍
Nov 27 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
django 控制页面跳转的例子
Aug 06 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
python interpolate插值实例
Jul 06 Python
Python3 如何开启自带http服务
May 18 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中的观察者模式
2010/03/24 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
js实现自动播放匀速轮播图
2020/02/06 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python绘制多个子图的实例
2019/07/07 Python
Python实现分数序列求和
2020/02/25 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
《影子》教学反思
2014/02/21 职场文书
敬老院活动总结
2014/04/28 职场文书
厕所文明标语
2014/06/11 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
男人帮观后感
2015/06/18 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS