为什么python中两个不同变量的地址相差320?

问题描述

enter image description here

我在 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

您实际上将小整数缓存中 1020 的内存位置分别分配给变量 xy。这就是为什么您会看到它们之间存在 320 字节 (32 * 10) 的差异。

请注意,此行为仅适用于 CPython。其他 Python 解释器可能没有小的整数缓存,或者它们可能以不同的方式实现 id() 函数。