python缓存小整数-5到256以提升性能和节省内存,该范围在cpython中固定且不可配置;超出范围的整数每次创建新对象,is判断通常为false;应始终用==而非is比较数值相等性。

Python 对小整数做了对象缓存,目的是减少内存开销和提升性能。这个机制让相同值的小整数在程序中复用同一个对象,所以 is 判断可能为 True,而不仅限于 ==。
缓存范围是 [-5, 256]
CPython(官方 Python 解释器)默认将整数 -5 到 256(含) 缓存为单例对象。超出该范围的整数每次创建都是新对象:
a = 256; b = 256; print(a is b) # Truea = 257; b = 257; print(a is b) # False(通常,但非绝对,见下文)a = -5; b = -5; print(a is b) # Truea = -6; b = -6; print(a is b) # False
为什么选这个范围?
这是基于经验统计:日常代码中,-5 ~ 256 这个区间内的整数被高频使用(如循环索引、状态码、ASCII 值、布尔转换结果等)。缓存它们性价比高,既节省内存又避免重复构造开销。
该范围写死在 CPython 源码中(Objects/longobject.c),不是可配置项,也不随 Python 版本频繁变动(3.0–3.12 均保持一致)。
立即学习“Python免费学习笔记(深入)”;
注意:is 判断不等于相等判断
缓存机制只影响对象身份(id() 和 is),不影响数值语义:
-
1000 is 1000可能在某些场景返回True(如字面量在同一行、被编译器优化),但这属于实现细节,不可依赖; -
1000 == 1000永远为True,这才是正确的比较方式; - 永远不要用
is比较整数大小或做逻辑判断,除非你明确在检测是否为缓存内对象(极少见)。
其他解释器可能不同
PyPy、Jython 或 MicroPython 等不一定采用相同缓存策略或范围。例如 PyPy 也有缓存,但具体上下界未必完全对齐 CPython。跨平台或嵌入式场景下,不应假设缓存行为一致。










