为何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+x的结果是-6(在小整数池里),但因为x本身不在池里,导致1+x和x+1生成不同的对象,让第一个if条件不成立;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
相关产品推荐
相关产品推荐

