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

Python不可变对象同一性疑问:同值对象ID为何不总是相同?

为什么Python中值相同的整数用is判断结果会因范围不同而不同?

这核心原因是Python的小整数缓存(Integer Interning)机制,具体细节如下:

  • 小整数缓存的作用:Python为了优化性能,会预先创建好范围在 -5 到 256 之间的整数对象,把它们存放在一个固定的内存区域里。当你创建变量引用这个范围内的整数时,不会新生成对象,而是直接指向缓存里的已有对象。所以两个变量只要值在这个区间内,用is(比较内存地址)判断就会返回True。

  • 超出范围的整数处理:对于超出 -5 到 256 的整数,Python不会预先缓存。每次创建新变量时,都会在内存中生成一个全新的整数对象——哪怕两个变量的值完全相同,它们指向的也是不同的内存地址,所以用is判断会返回False。

举个直观的例子:

# 小整数范围内
x = 100
y = 100
print(x is y)  # 输出 True

# 超出小整数范围
m = 300
n = 300
print(m is n)  # 输出 False

需要注意的是,is和==的作用完全不同:==比较的是变量的值,is比较的是变量指向的对象内存地址。所以哪怕m is n返回False,m == n依然会返回True,因为它们的值是相同的。

另外,你之前的误解“任意值相同的不可变对象ID都相同”并不成立,除了整数的缓存限制,其他不可变类型(比如字符串)也有类似的有限缓存机制,并非所有值相同的不可变对象都会共享内存地址。

内容的提问来源于stack exchange,提问作者Vigneshwara Reddy S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10