对 Python 的 id() 感到困惑

Confused about Python’s id()

我能理解下面的定义:

Every object has an identity, a type and a value. An object's identity never changes once it has been created; you may think of it as the object’s address in memory. The is operator compares the identity of two objects; the id() function returns an integer representing its identity.

我假设上面的定义在创建“某物”时有效,例如:

>>> a = 0
>>> id(a)
1720438480

但是我不明白:

>>> id(1)
1720438512
>>> b = 1
>>> id(b)
1720438512

我还没有创建任何东西;那么整数“1”怎么会有ID呢?是不是说我在PythonShell中一“提到”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 和 returns 它的 id (CPython 中对象的内存地址)。完成此操作后,整数对象 1000 的引用计数为零并被删除。这确保您不能仅通过编写 id(something)(而不是将任何变量名绑定到对象)来填充内存。

通常,您无法预测何时会发生重用,但在我的 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 是特殊情况,因为它们 总是 存在(因此总是具有相同的 id在 Python 运行时)。这是为了避免重复创建和销毁常用整数的优化。