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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python数据结构之链表详解
Sep 12 Python
python滑块验证码的破解实现
Nov 10 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
jupyter notebook清除输出方式
Apr 10 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python爬虫中url管理器去重操作实例
Nov 30 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中strtotime函数用法详解
2014/11/15 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
JavaScript之引用类型介绍
2012/08/10 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
Django查询数据库的性能优化示例代码
2017/09/24 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
Python封装原理与实现方法详解
2018/08/28 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
python中rb含义理解
2020/06/18 Python
应聘收银员个人的求职信
2013/11/30 职场文书
物资采购方案
2014/06/12 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS