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中用sleep()方法操作时间的教程
May 22 Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Django MEDIA的配置及用法详解
Jul 25 Python
numpy求平均值的维度设定的例子
Aug 24 Python
Python进程池Pool应用实例分析
Nov 27 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
Django给表单添加honeypot验证增加安全性
May 06 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和date函数判断日期是否有效代码分享
2013/12/25 PHP
10个php函数实用却不常见
2015/10/13 PHP
为你总结一些php信息函数
2015/10/21 PHP
php blowfish加密解密算法
2016/07/02 PHP
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
python创建和删除目录的方法
2015/04/29 Python
Python的Django框架中的Context使用
2015/07/15 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
结婚喜宴主持词
2014/03/14 职场文书
股权收购意向书
2014/04/01 职场文书
2014年个人年终总结
2015/03/09 职场文书
推广普通话的宣传语
2015/07/13 职场文书
MySQL触发器的使用
2021/05/24 MySQL
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
python图片灰度化处理的几种方法
2021/06/23 Python