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使用pil生成缩略图的方法
Mar 26 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
python 字符串和整数的转换方法
Jun 25 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Keras loss函数剖析
Jul 06 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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缓存技术介绍
2006/11/25 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
js转义字符介绍
2013/11/05 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python下载图片实现方法(超简单)
2017/07/21 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
关于学习的演讲稿
2014/05/10 职场文书
综合管理员岗位职责
2015/02/11 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js