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

为什么在Python中`300 is 301 - 1`会返回`True`?

为什么300 is 301 - 1返回True,而lambda版本返回False?

核心原因在于CPython的编译期常量折叠优化:

  • 对于300 is 301 - 1,CPython在编译这段代码时,会直接计算常量表达式301 - 1的结果,将其替换成字面量300。这条语句最终等价于300 is 300,两个字面量指向同一个对象(哪怕300不在小整数缓存范围),因此返回True。

  • 而300 is (lambda x: x - 1)(301)是运行时计算的:lambda函数接收参数301后,在运行时执行x - 1得到300。这个运行时生成的300不在小整数缓存[-5,256]范围内,会被创建为新的整数对象,和直接写的字面量300不是同一个内存地址,所以is判断返回False。

补充说明:小整数缓存是CPython的性能优化手段,提前创建[-5,256]范围内的整数对象并重复使用。但该缓存仅覆盖字面量和编译期确定的常量,运行时动态生成的超出该范围的整数,会创建新对象。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:04:53