is 运算符对非缓存整数的意外行为
问题:
在函数内,is 运算符返回当比较 [-5, 256] 范围之外的两个整数字面量时为 True,但在函数外部进行比较时为 False。为什么会出现这种不一致的情况?
答案:
tl;dr:
Python解释器以代码块为单位执行。功能是单个块,而交互式命令是单独的块。每个块都包含自己的对象,包括整数。因此,函数内部声明的整数指向同一个对象,而函数外部声明的整数则不然。
详细说明:
-
函数:
- 代码块在函数内定义。
- 块内的文字(例如 1000)存储为单个对象。
- 是检查对象身份,因此函数中的 a is b 返回 True,因为 a 和 b 都指向同一个对象。
-
交互式命令:
- 每个命令都作为单独的代码块执行。
- 每个块中的文字存储为单独的对象。
- 检查对象身份,并且由于文字的对象不同,a is b 返回 False。
其他观察:
- 此行为适用于非整数文字(例如浮点文字)。
- Python 使用字典来存储代码对象中的常量,并在添加新常量之前检查现有常量。
注意事项:
-
链式语句:当命令链式时(例如,a = b = 1000),它们被解释为单个代码块,导致 True。
-
模块级别执行:模块级别执行(例如,a = b = 1000)发生在单个代码块内,结果为 True。
-
可变对象: 不一致不适用于可变对象; a = b = [] 总是会产生 False。
以上是为什么'is”运算符对于函数内部和外部的非缓存整数的行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!