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
相关产品推荐
相关产品推荐

