为什么python dict的id保持不变?

为什么python dict的id保持不变?,python,Python,我们有一个类似于: a = dict() 然后我们插入项目,如: for i in range(10**10): a[i] = 0 为什么当dict太大而无法重新分配内存时,id(a)仍保持不变?让我们从引用id内置函数的状态开始: id(对象) 返回对象的“标识”。这是一个整数 保证该对象在运行期间唯一且恒定 它的一生。两个生命周期不重叠的对象可能具有相同的 相同的id()值 CPython实现细节:这是中对象的地址 记忆 要理解您的代码片段,请执行以下操作: a = dict()

我们有一个类似于:

a = dict()
然后我们插入项目,如:

for i in range(10**10):
    a[i] = 0

为什么当dict太大而无法重新分配内存时,
id(a)
仍保持不变?

让我们从引用id内置函数的状态开始:

id(对象) 返回对象的“标识”。这是一个整数 保证该对象在运行期间唯一且恒定 它的一生。两个生命周期不重叠的对象可能具有相同的 相同的id()值

CPython实现细节:这是中对象的地址 记忆

要理解您的代码片段,请执行以下操作:

a = dict()
for i in range(10**10):
    a[i] = 0 
您首先需要了解第
a=dict()
行的情况,在本例中,您创建了一个新的python dictionary对象,并将其分配给变量
a
,在这一点上,如果我们参考docs部分,其中谈到在对象的整个生命周期中保持唯一性的
id
,那么一切都应该是有意义的。例如,假设我们有:

a = dict()
print(id(a))
a = dict() # New object
print(id(a))
上面您可以清楚地看到id(a)应该如何更改,这主要是因为
a
的第二次赋值中的对象不同。另一个例子:

a = dict() # id1
b = dict() # id2
a = b      # id2
同样,您已经创建了2个dict对象,在第三次赋值中,
a=b
,id(a)将是
id2
,在vars
a
b
引用的对象的生命周期内,该id将保持唯一


现在,您的问题中有趣的部分是,您想知道为什么
a
id
即使在向字典中插入新项也不会改变。要理解,即使在调用
\uuuu setitem\uuuu
时底层内存对象最终会发生更改,您也需要知道(底层cpython实现)并且在特定的增长率下,
id
文档提供的语句在对象生命周期内保持不变,并且id将是唯一的。

无论大小,对象都是相同的?因此,
id
不会被更改dict对象仍然是一样的,不管底层内存如何。这实际上是一个好问题,我不理解下面的投票。我认为这可能与以下事实有关:
id
仅在CPython中对应于内存中对象的地址(参见)。我同意@Djib2011,但实际上它甚至不是CPython的东西。无论它是否是内存中的地址,[它]在对象的生命周期内保证是唯一和恒定的。我同意,我不明白为什么会被否决,这个问题很好,为了正确回答,您需要正确了解内部实现。。。其他答案将只是琐碎的、肤浅的或显而易见的。。。在这种情况下,内存分配发生在哪里+对于一个新撰稿人提出的一个非常好的问题:感谢你的回答,这是一个非常有趣的问题。这是我的第一个问题,所以我的描述很不清楚,下次我会改进这个。事实上,我想知道的是,在python中,函数id()是内存中对象的地址,那么为什么dict对象变得太大,并重新分配内存呢。但仍然使用相同的id(意思是相同的地址?),这很有趣。可能这个答案很接近,但我不确定。这很好:)。。。起初,当我开始提问时,我的问题很糟糕,现在我的情况稍微好一些,但我仍然会发现自己收到很多反对票;)。确保你们阅读了这个链接,这将帮助你们改进未来的问题。关于当前的问题,我的回答是否回答了您的问题?如果是这样,考虑把它标记为有效的。