Python中整数对象内存地址差异的原因探究
为什么两段Python代码的内存地址输出不同?
这事儿的核心原因是CPython的小整数缓存(Small Integer Caching)机制,说白了就是Python为了省内存、提速度搞的实用小优化。
咱们一步步拆解:
代码1的情况:p=89和x=89指向同一个对象
CPython在启动时,会预先创建好**-5到256**这个范围内的所有整数对象,把它们存在缓存里。当你给变量赋值这个范围内的整数时,Python不会新创建对象,而是直接把变量绑定到缓存里已有的那个对象上。
所以代码1里的p和x都绑定到了缓存里的89对象,它们的__repr__方法所属的对象自然是同一个,内存地址也就完全一致了。你运行这段代码:
p=89 x=89 print(p.__repr__,x.__repr__)
输出的两个内存地址相同,就是这个道理。
代码2的情况:p=898和x=898指向不同对象
898超出了-5到256的缓存范围,这时候Python没法用预先缓存的对象了,只能每次赋值都新创建一个整数对象。所以p绑定的是一个新的898对象,x绑定的是另一个全新的898对象,两个对象的内存地址自然不一样。
运行这段代码:
p=898 x=898 print(p.__repr__,x.__repr__)
就会看到两个不同的内存地址输出。
额外补充
- 这个缓存机制是CPython的实现细节,其他Python解释器(比如PyPy)可能有不同的缓存策略,甚至缓存更大的范围,但-5到256的缓存是CPython的标准操作。
- 你也可以用
is运算符来验证两个变量是否指向同一个对象:比如p is x在代码1里会返回True,代码2里返回False。
内容的提问来源于stack exchange,提问作者Prashant Singh
相关产品推荐
相关产品推荐

