为什么 Python 的'is”运算符对于不同代码块中的大整数表现不同?
Python 对大整数的“is”运算符行为
问题
在 Python 中,is 运算符检查对象身份而不是等价性。但是,在某些情况下,此行为可能是意外的,如下所示:
<code class="python">def func(): a = 1000 b = 1000 return a is b a = 1000 b = 1000 print(a is b, func()) # (False, True)</code>
登录后复制
is 比较在函数内返回 True,但在函数外返回 False。尽管评估结果不同,整数 a 和 b 似乎具有相同的值。
解释
要理解这种行为,Python 解释器对代码块的解释至关重要。根据Python参考手册,交互执行的每个命令都构成一个单独的代码块。以下内容被视为块:
- 模块
- 函数体
- 类定义
在单个代码块中,Python 缓存某些对象,例如小整数(在 [-5, 256] 范围内)。当多个变量引用相同的整数文字时,它们都将引用相同的缓存整数对象。但是,如果在不同的代码块中声明文字,则会创建不同的整数对象。
不同的代码对象,不同的标识
为了说明这一点,请考虑每种情况的代码对象:
- 函数 func: a 和 b 引用同一个整数对象(由 Python 缓存,因为 1000 在缓存的整数范围内)。
- 交互式命令: a 和 b 引用不同的整数对象,因为它们是在单独的代码块中定义的。
因此,a is b 在 func 块中计算为 True,其中所有整数都是缓存,并且在创建单独对象的块外为 False。
注意事项
请注意以下注意事项:
- 在单行中链接赋值语句可能会导致在 True 身份检查中。
- 由于模块的单个代码块,模块级执行将返回 True。
- 涉及可变对象的测试将始终返回 False,因为它们没有被缓存。
结论
理解 Python 中代码块的概念对于解释涉及身份比较的意外行为至关重要。虽然对于检查不可变对象的身份很有用,但建议使用相等运算符(==)来比较值,因为它不依赖于缓存。
以上是为什么 Python 的'is”运算符对于不同代码块中的大整数表现不同?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前
By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
R.E.P.O.保存文件位置:在哪里以及如何保护它?
3 周前
By DDD

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)