This question already has answers here:
Why is the id of a Python class not unique when called quickly?

(6个答案)


3年前关闭。




我可以理解以下定义:



我认为上面的定义在创建“某物”时起作用,例如:
>>> a = 0
>>> id(a)
1720438480

但是我不理解:
>>> id(1)
1720438512
>>> b = 1
>>> id(b)
1720438512

我还没有创建任何东西。那么整数“1”如何具有ID?这是否意味着只要我在Python Shell中“提及” 1,便立即将其分配给内存地址?另外,这是否意味着因为ID在其生命周期内从未发生变化,并且由于我的计算机内存有限,所以如果我反复询问唯一事物的id(),我最终会得到类似“内存不足”的信息吗? (它不能重新分配内存,因为其他对象的生命期尚未结束。)

或者,从相反的方向显示我的耳朵:
>>> id(something_1)
some unique memory address
>>> id(something_2)
some unique memory address
>>> ...

在什么时候重新分配内存?也就是说,在这一点上,
>>> my_variable = something_1
>>> id(my_variable)

会给出与id(something_1)不同的ID?

最佳答案

通常,一旦您使用整数或字符串或任何其他文字,Python就会在您的内存中创建一个新对象。保证在对象的生存期内具有相同的id,即,其引用计数不为零。

当您编写类似以下内容的内容时:

>>> id(1000)
140497411829680

Python创建整数1000,并返回其id(CPython中对象的内存地址)。完成此操作后,整数对象1000的引用计数为零,并将其删除。这样可以确保您不能仅通过写入id(something)(并且不将任何变量名绑定(bind)到对象)来保持填充内存。

通常,您无法预测何时会发生重用,但是在我的Python Shell中,它会相当一致地发生:
>>> id(1000)
140697307078576
>>> id(1001)
140697307078576
>>> id(1002)
140697307078576
>>> id(1003)
140697307078576

您会看到在创建每个新整数时,一次又一次地使用相同的内存地址。但是,如果您防止引用计数下降到零,则可以看到使用了新的内存来代替:
>>> a = 1000
>>> id(a)
140697307078576
>>> b = 1001
>>> id(b)
140697306008368

在CPython中,整数-5到255是特殊情况,因为它们始终存在(因此在Python运行时始终具有相同的id)。这是为了避免重复创建和销毁常用整数而进行的优化。

关于python - 对Python的id()感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33801444/

10-12 16:10
查看更多