结论:这是 CPython 的两层对象复用优化叠加的结果:1)小整数缓存——启动时预创建 [-5, 256] 的整数对象,所有赋值共享同一对象,is 必为 True;2)编译器常量折叠与驻留——同一代码块内的相同字面量可能合并为同一常量对象,超出 256 也可能 is 为 True(交互式同一行、同函数内常见),但这是实现细节,无规范保证。

展开:要点是分清"值相等"与"同一对象":== 比较值(走 __eq__),is 比较身份(内存地址)。整数、短字符串等不可变对象被复用纯属优化——因为不可变,共享永远安全;语言规范只承诺不可变对象的值语义,从不承诺缓存范围,PyPy 等其他实现行为不同。由此推出编码铁律:永远用 == 判值,用 is 只判单例is Noneis True、枚举、sentinel 对象)。字符串驻留(interning)类似:标识符样子的短串自动驻留,长串可 sys.intern() 手动驻留以加速 dict 键比较。

a, b = 256, 256
print(a is b)   # True —— 小整数缓存
x, y = 257, 257
print(x is y)   # 脚本内同一代码块常 True(常量合并),跨语句/交互式分行可能 False
print(x == y)   # True —— 唯一可依赖的判断

易错点:不要根据 is 的偶然结果为真写逻辑,换实现/换解释器/换写法就翻车。追问方向:字符串驻留的判定规则、sys.getsizeof 看整数对象大小(28 字节起步的原因)。