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
相关产品推荐
相关产品推荐

