Python漫谈:一个关于内存分配的常见误区

169 阅读1分钟

0.缘起

之前逛博客的时候,看到博文教程在描述python的基于值的内存管理模式的时候采用了类似下面这个例子的例子:

num=1
num2=1
print(id(num)
print(id(num2))

此时运行代码,可以得到结果:

image.png

不难发现num和num2的id相同,作者希望通过如上的例子说明,假如为不同变量赋值为相同值,这个值在内存中只有一份,多个变量指向同一块内存地址。

此时我们不妨再试试看其他的情况

num=3000
num2=3000
print(id(num)
print(id(num2))

此时运行代码,可以得到结果:

image.png

此时可以发现num和num2在值相同的情况下,其id也是不相同

1. 真正的原因

实际上在第一个例子中所出现id相同的情况是由python的对象池引起的,对象池是存放了一批已经创建好的对象的池,它是一个用来维护对象的结构。当程序需要使用对象的时候,可以直接从池中获取该对象,而不是实例化一个新的对象。python中的整型对象池已经生成了[0,256]间的所有整数,一旦超出这个界限,就需要生成新的整型对象。

image.png