为何Python中257的整数驻留表现在脚本与交互模式下有差异?
为什么257在脚本执行和交互模式下
is判断结果不同? 先看实际场景:
我们有foo.py文件,代码如下:
a = 257 b = 257 print(a is b)
通过终端执行脚本时,输出为True:
(.venv) user@group:~/development/playground$ python3 ./foo.py True
但在Python交互模式下执行相同代码,输出为False:
>>> a = 257 >>> b = 257 >>> print(a is b) False
使用Python版本为3.10.12,背后的原因可以从两个角度解释:
核心原理:整数驻留与编译优化的差异
首先明确:is运算符判断的是两个变量是否指向内存中的同一个对象,而非值是否相等。Python默认会对-5到256的小整数做整数驻留(即缓存这些整数对象,避免重复创建),但257不在这个默认缓存范围内,正常情况下不会自动驻留。
脚本执行时的优化:常量折叠
当Python解释器编译整个脚本文件时,会执行常量折叠优化:它会一次性扫描整个代码中的常量值,发现a = 257和b = 257中的257是完全相同的常量,就会只在内存中创建一个257的整数对象,让a和b都指向这个对象。所以用is判断时,结果就是True。
交互模式的逐行编译限制
交互模式下,Python是逐行编译、逐行执行的。输入a = 257时,解释器编译并执行这一行,创建一个257的对象;输入b = 257时,又重新编译执行这一行,创建另一个独立的257对象。两个变量指向不同的内存地址,因此a is b返回False。
简单来说,脚本是整体编译触发了常量合并,交互模式逐行处理没触发这个优化,导致了结果差异。
内容的提问来源于stack exchange,提问作者marcelegi
相关产品推荐
相关产品推荐

