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

Python整数与is运算符在Jupyter与脚本运行的差异疑问

Python逐行运行与脚本运行时整数内存地址差异的原因

核心差异源于两种环境的编译执行机制

Python代码的执行分为编译阶段和运行阶段,脚本文件运行与Jupyter逐行运行的核心区别在于是否进行全局编译优化,具体体现在以下几点:

1. 脚本文件的编译期常量折叠优化

当以python main.py运行脚本时,解释器会先对整个脚本做全局编译优化,其中的常量折叠规则会处理可预计算的表达式:

  • 对于840+5这类能在编译阶段算出结果的表达式,解释器会直接将其替换为最终常量845。因此a=845和b=840+5实际上指向同一个预生成的常量对象,a is b返回True。
  • 而int("8"+"4"+"5")属于运行期动态计算:字符串拼接和int()类型转换只能在代码运行时完成,无法在编译期确定结果,因此会创建全新的整数对象,和a=845的内存地址不同,a is b返回False。

2. Jupyter逐行运行的无全局编译优化

Jupyter(包括Python原生交互式Shell)采用逐行编译执行的模式,每一行代码独立编译、运行,不会对跨行代码做全局优化:

  • 哪怕是a=845和b=840+5这两行,也会分别处理:第一行创建整数845的对象,第二行的840+5会在运行时重新计算并生成新对象,两者内存地址不同,a is b返回False。
  • 同样,int("8"+"4"+"5")在运行时生成新对象,自然和a=845的地址不一致。

3. 补充:小整数池的边界情况

Python默认会缓存-5到256之间的整数(小整数池),这类整数在任何环境下都会被全局复用,用is比较必然返回True。但测试中的845超出了这个范围,因此复用逻辑完全由编译优化决定。


内容的提问来源于stack exchange,提问作者Daviid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:27:22