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读取html中指定元素生成excle文件示例
Apr 03 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
Django给admin添加Action的步骤详解
May 01 Python
Flask框架单例模式实现方法详解
Jul 31 Python
Python之指数与E记法的区别详解
Nov 21 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
python科学计算之narray对象用法
Nov 25 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
class类在python中获取金融数据的实例方法
Dec 10 Python
python tkinter模块的简单使用
Apr 07 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可变函数的使用详解
2013/06/14 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
javascript 闭包详解
2015/02/15 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
椰子猫砂:CatSpot
2018/08/27 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
教师学习培训邀请函
2014/02/04 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
义卖募捐活动总结
2015/05/09 职场文书