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

