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

Python中整数驻留是否与缩进相关?257缩进后is判断结果异常

问题原因解析

核心:CPython的代码块编译优化与整数驻留机制

CPython对整数的处理有两个关键逻辑:

  • 小整数驻留池:默认对-5到256的整数做全局驻留,这些整数的不同赋值会指向同一个内存对象,用is判断返回True;但257不在这个范围内,全局不会驻留。
  • 代码块级常量复用:当Python编译一个完整代码块(比如if/for/while的缩进块、函数体、类定义等)时,会对块内的相同常量做局部优化,复用同一个对象,哪怕这个常量不在小整数驻留池里。

针对你的场景拆解

  1. 顶级作用域的代码(无缩进)
    在Jupyter Notebook的单元格顶级、Python终端交互式环境中,代码是逐行编译执行的,顶级作用域的赋值不属于“完整代码块”,不会触发局部常量复用优化。所以a = 257和b = 257会创建两个独立的257对象,a is b返回False。

  2. 缩进代码块内的代码
    if/for/while的缩进块属于完整代码块,编译时会对块内的相同常量做复用处理。所以同一个缩进块里的a = 257和b = 257会指向同一个257对象,a is b返回True。

  3. .py文件运行的情况
    当运行.py文件时,整个文件会被作为一个完整代码块编译,文件内所有的相同常量都会被优化复用,不管是在顶级还是缩进块里,所以两段代码的a is b都会返回True。

注意事项

is用于判断两个变量是否指向同一个内存对象,而==用于判断变量的值是否相等。实际开发中,如果要比较整数的值,应该使用==而非is,is仅适合判断单例对象(比如None)或小整数驻留池内的整数。

内容的提问来源于stack exchange,提问作者윤석진

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:55:28