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

为何Python 3.7中check(-7)返回True?函数逻辑存疑

为什么check(-7)会返回True?

这是个挺有意思的Python细节问题,核心在于is运算符的本质和Python对小整数的缓存机制,咱们一步步拆解:

首先得明确两个关键前提:

  • is运算符比较的是对象的内存地址(身份),而不是值是否相等;如果要比较值相等,应该用==。
  • Python会默认缓存-5 到 256之间的整数对象,这个范围内的整数在程序运行时会被复用——也就是说,只要值相等,它们就指向同一个内存地址,is判断会返回True。

现在我们跟着check(-7)的执行流程走:

第一步:判断1+x is x+1

当x=-7时,1+x和x+1的值都是-6,但这个is判断却返回了False——这是Python 3.7及更早版本的特定行为:
如果加法表达式中的一个操作数是不在小整数池里的对象(这里x=-7,小于-5,不在缓存池范围内),解释器计算加法时,哪怕结果在缓存池里,也可能生成新的对象,而非复用缓存:

  • 计算1+x:1是缓存池里的对象,加上x=-7(新创建的对象),得到-6,此时解释器会返回缓存池里的-6实例;
  • 计算x+1:x=-7是新对象,加上1(缓存对象),得到-6,但此时解释器会生成一个全新的-6对象,而非复用缓存里的。

这就导致1+x和x+1值相等,但内存地址不同,所以1+x is x+1为False,第一个if条件不触发,不会返回False。

第二步:判断2+x is not x+2

当x=-7时,2+x和x+2的值都是-5。-5是小整数池的下限,Python对这个边界值的缓存处理更特殊:无论操作数是否在缓存池里,计算得到的-5都会复用缓存中的实例。

所以2+x和x+2指向的是同一个内存地址,2+x is not x+2为False,第二个if条件也不触发,不会返回False。

第三步:返回True

两个if条件都不满足,函数最终返回True。

为什么偏偏是-7?

只有x=-7时,刚好同时满足两个关键条件:

  1. 1+x的结果是-6(在小整数池里),但因为x本身不在池里,导致1+x和x+1生成不同的对象,让第一个if条件不成立;
  2. 2+x的结果是-5(小整数池的边界值),无论计算方式如何都会复用缓存对象,让第二个if条件也不成立。

换其他值都无法同时满足这两点:

  • 比如x=-6:1+x=-5,x+1=-5都是缓存对象,1+x is x+1为True,第一个if触发直接返回False;
  • 比如x=-8:2+x=-6,x+2=-6会因为x不在池里生成不同对象,2+x is not x+2为True,第二个if触发返回False。

内容的提问来源于stack exchange,提问作者Bharath M Shetty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:39:15