Python 名称/绑定(bind) - 为什么不是所有长度相同的列表都是 "same list"?

标签 python pointers

我知道有大量关于 Python 中的指针和引用(或者更确切地说:名称和绑定(bind)!)的资源,但我很难理解最后一点:

我知道如果 a = 1b = 1 比它们都“绑定(bind)”到相同的 1 并且将具有相同的 id () (因此,我认为是内存地址)。如果你设置,我也会得到:

a = [1, 2, 4]
b = a
b[0] = 45
# a is now [45, 2, 4]

因为 ab 绑定(bind)到同一个列表(对象),并且其中一个的更改会导致另一个的更改。同样,a[0]b[0] 是同一个对象。该列表包含具有不同 ID 的其他对象 - 即列表标识未绑定(bind)到其内容。

好的。到目前为止,一切都很好。我可以接受有“未出生的”列表和数字在等待初始化(尽管只有一次!),并且一旦我们需要它们,Python 就会负责为它们分配内存空间。那为什么,如果我这样做:

d = [1, 2]
e = [145, 7]
# id(d) and id(e) are not the same?!

Python 的存在中不应该只有一个 2 元素列表吗?这对我来说是一致的(然后只有一个 1、一个 2、一个 145 等)。

任何解释都将不胜感激——包括将它与指针相关联的解释(因为我对在内存管理级别做出的决定也有些迷惑,但我想这是 Python 的执行模型而不是我关心的问题!)

最佳答案

您被 CPython 中针对 int 的优化(即 int 缓存)误导了。参见 this著名的问题。这记录在案 here :

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.

几乎在所有其他情况下,使用文字都会创建一个新对象。实际上,在该范围之外使用 int,您会看到正常的行为:

>>> a = 100000
>>> b = 100000
>>> id(a)
4322630608
>>> id(b)
4322630640
>>> c = a
>>> id(a) == id(b)
False
>>> id(a) == id(c)
True

我几乎每天都需要重复这个,但是 Python 中的赋值从不复制

关于Python 名称/绑定(bind) - 为什么不是所有长度相同的列表都是 "same list"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102561/

相关文章:

python - 尝试导入 P4 时没有名为 P4API 的模块

python - 在 Django 中解析 json 中的日期

c - 如果像这样初始化,则重新分配二维数组 : char (*A)[size] = malloc(sizeof(char[size][size]))

c++ - 收集指针和添加对象

c - 如何将二维字符指针发送到内存分配函数?

C - 将字符串添加到数组 x 中并将其从数组 y 中删除

c++ - 两个指针指向同一个引用

python - 在 Pandas 中为两列和单个数据行创建 DataFrame

python - 按值加入列表

python - 使用 Python 遍历目录