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

Why the difference is 320 in the address of two different variables in python?

我为 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]

小整数通常在 Python3 中占用 28 个字节,但可能由于一些 4 字节的开销,上面的每个数字正好占用 32 个字节:

>>> id(1) - id(0)
32

当你这样做时

>>> x = 10
>>> y = 20

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

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