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中while循环语句用法简单实例
May 07 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 Python
python游戏开发Pygame框架
Apr 22 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
ADODB类使用
2006/11/25 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
layui实现三级联动效果
2019/07/26 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
简单介绍Python中的RSS处理
2015/04/13 Python
python通过ssh-powershell监控windows的方法
2015/06/02 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
学习python可以干什么
2019/02/26 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python 进程池pool使用详解
2020/10/15 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
法雷奥SQA(electric)面试问题
2016/01/23 面试题
英语教师岗位职责
2014/03/16 职场文书
五四青年节演讲稿
2014/05/26 职场文书
运动会加油口号
2014/06/07 职场文书
慰问信格式
2015/02/14 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫