Python中is运算符对函数返回整数的判断差异疑问解析
问题解释:pow返回的1为何无法通过
is与字面量1判断相等? 示例代码
x = 1 y = 1 print(x is y) # TRUE print(id(x), id(y)) y = pow(10, 30, 10**30-1) # 1 print(type(y)) print(x, y, x is y) # FALSE
运行结果
True 140516304938720 140516304938720 <class 'int'> 1 1 False
原因解析
核心逻辑:Python整数缓存机制与运算路径的差异
Python为了优化性能,会对**-5到256之间的小整数做缓存**——用字面量创建这些整数时,会直接复用内存中已有的同一个对象,所以x = 1和y = 1指向的是同一个内存地址,x is y返回True。
但缓存的复用有场景限制,具体到你提到的两种情况:
情况1:
y = pow(10, 30, 10**30-1)
这个运算本质是求10^30除以10^30-1的余数,结果确实是1,但整个计算过程涉及超大整数(10^30远大于256)。Python处理这类大整数运算的余数时,会直接生成一个新的int对象,不会去复用缓存里的1,导致这个y的内存地址和x不同,x is y返回False。情况2:
y = pow(1, 10)
这个运算的参数都是小整数,结果1也在缓存范围内。Python解释器会对这类简单运算做优化,直接返回缓存中已有的1对象,所以y和x指向同一个内存地址,x is y返回True。
需要注意:is判断的是对象的身份(内存地址),而==判断的是值的相等性。这里两个1的值相等,但对象身份不同,才会出现值相等但is判断为False的现象。
内容的提问来源于stack exchange,提问作者Ли Шеньшунь
相关产品推荐
相关产品推荐

