为什么在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
相关产品推荐
相关产品推荐

