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

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,提问作者Ли Шеньшунь

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:10:14