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多线程学习资料
Dec 19 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python向日志输出中添加上下文信息
May 24 Python
python如何定义带参数的装饰器
Mar 20 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
python编写俄罗斯方块
Mar 13 Python
导致python中import错误的原因是什么
Jul 01 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python简单实现插入排序实例代码
Dec 16 Python
Python中读取文件名中的数字的实例详解
Dec 25 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
PHP如何实现跨域
2016/05/30 PHP
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
用python爬取租房网站信息的代码
2018/12/14 Python
Python中文编码知识点
2019/02/18 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
六十大寿答谢词
2014/01/12 职场文书
租赁意向书范本
2014/04/01 职场文书
售后客服个人自我评价
2014/09/14 职场文书
投诉书范文
2015/07/02 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2016年元旦致辞
2015/08/01 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
python中取整数的几种方法
2021/11/07 Python