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

Python中正负整数内存分配行为差异的原因问询

为什么Python中相同值的int变量有的内存地址相同,有的不同?

先还原你在Windows 7 cmd里的测试代码,方便大家理解场景:

Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 8
>>> b = 8
>>> id(a)
8791373558832
>>> id(b)
8791373558832
>>> a is b
True
>>> c = -8
>>> d = -8
>>> id(c)
4802576
>>> id(d)
5223952
>>> c is d
False
>>> type(a)
<class 'int'>
>>> type(c)
<class 'int'>

你观察到的现象,核心原因是CPython的小整数缓存机制——这是Python为了提升运行性能做的内存优化手段:

  • CPython在启动时,会预先创建好**-5到256区间内的所有整数对象**并缓存起来。之后只要你用到这个区间里的整数,就会直接复用已有的缓存对象,不会再重新分配新的内存空间。
  • 你的变量a和b赋值为8,正好落在这个缓存区间里,所以它们指向的是同一个内存对象,id()返回相同的地址,a is b自然返回True。
  • 而-8不在这个缓存区间内,每次给变量赋值-8时,Python都会创建一个全新的整数对象,所以c和d指向的是两个独立的对象,id()不同,c is d返回False。

这里还要特意区分两个容易混淆的运算符:

  • is:判断两个变量是否指向同一个内存对象(即内存地址是否完全相同)
  • ==:判断两个变量的值是否相等(哪怕是不同对象,只要值一致就返回True)

比如你测试里的c和d,虽然c is d是False,但执行c == d肯定会返回True。

另外要说明,这个缓存是CPython的特定优化策略,其他Python实现(比如PyPy)可能有不同的缓存规则,但标准CPython的默认行为就是这样的。

内容的提问来源于stack exchange,提问作者rustyhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:14:13