问题描述
我在 python 中为不同的变量初始化了不同的值
x = 10
y = 20
z = 30
当我使用 id(x)
,id(y)
,id(z)
查找 x,y,z 的相应地址时,我发现它们的所有地址都相差 320。
为什么它们相差 320 以及为什么它们的地址不连续。
解决方法
您正在看到名为 small integer cache 的 CPython 优化的结果。
CPython 将 -5 到 256(含)之间的整数存储在特殊缓存中,因为它们在用户程序中经常使用。这样解释器就不必每次使用数字时都初始化一个新对象:
>>> x = 10
>>> y = 10
>>> id(x) == id(y)
True
同时
>>> x = 1000
>>> y = 1000
>>> id(x) == id(y)
False
现在,假设小整数缓存在内存中如下所示:
[-5,-4,-3,...,10,... 20,256]
小整数在 Python 3 中通常占用 28 个字节,但可能因为有 4 个字节的开销,上面的每个数字正好占用 32 个字节:
>>> id(1) - id(0)
32
当你这样做
>>> x = 10
>>> y = 20
您实际上将小整数缓存中 10
和 20
的内存位置分别分配给变量 x
和 y
。这就是为什么您会看到它们之间存在 320 字节 (32 * 10) 的差异。
请注意,此行为仅适用于 CPython。其他 Python 解释器可能没有小的整数缓存,或者它们可能以不同的方式实现 id()
函数。