对 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 运行时)。这是为了避免重复创建和销毁常用整数的优化。
我能理解下面的定义:
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; theid()
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 运行时)。这是为了避免重复创建和销毁常用整数的优化。