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笔记(叁)继续学习
Oct 24 Python
python提取内容关键词的方法
Mar 16 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python实现队列的方法
2015/05/26 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
《藏戏》教学反思
2014/02/11 职场文书
主题团日活动总结
2014/06/25 职场文书
店铺转让协议书
2014/12/02 职场文书
经理岗位职责范本
2015/04/15 职场文书
2015中秋祝酒词
2015/08/12 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
筑梦中国心得体会
2016/01/18 职场文书
初中地理教学反思
2016/02/19 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android