Python中整数驻留是否与缩进相关?257缩进后is判断结果异常
问题原因解析
核心:CPython的代码块编译优化与整数驻留机制
CPython对整数的处理有两个关键逻辑:
- 小整数驻留池:默认对
-5到256的整数做全局驻留,这些整数的不同赋值会指向同一个内存对象,用is判断返回True;但257不在这个范围内,全局不会驻留。 - 代码块级常量复用:当Python编译一个完整代码块(比如
if/for/while的缩进块、函数体、类定义等)时,会对块内的相同常量做局部优化,复用同一个对象,哪怕这个常量不在小整数驻留池里。
针对你的场景拆解
顶级作用域的代码(无缩进)
在Jupyter Notebook的单元格顶级、Python终端交互式环境中,代码是逐行编译执行的,顶级作用域的赋值不属于“完整代码块”,不会触发局部常量复用优化。所以a = 257和b = 257会创建两个独立的257对象,a is b返回False。缩进代码块内的代码
if/for/while的缩进块属于完整代码块,编译时会对块内的相同常量做复用处理。所以同一个缩进块里的a = 257和b = 257会指向同一个257对象,a is b返回True。.py文件运行的情况
当运行.py文件时,整个文件会被作为一个完整代码块编译,文件内所有的相同常量都会被优化复用,不管是在顶级还是缩进块里,所以两段代码的a is b都会返回True。
注意事项
is用于判断两个变量是否指向同一个内存对象,而==用于判断变量的值是否相等。实际开发中,如果要比较整数的值,应该使用==而非is,is仅适合判断单例对象(比如None)或小整数驻留池内的整数。
内容的提问来源于stack exchange,提问作者윤석진
相关产品推荐
相关产品推荐

