You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:05:58