对Python的id()感到困惑

bla*_*ned 4 python identity memory-management python-3.x

我可以理解以下定义:

每个对象都有一个标识,一个类型和一个值。一旦创建了对象,其身份就不会改变。您可能会认为它是对象在内存中的地址。所述is操作者比较两个对象的身份; 该id()函数返回一个表示其身份的整数。

我认为上面的定义在创建“某物”时起作用,例如:

>>> a = 0
>>> id(a)
1720438480
Run Code Online (Sandbox Code Playgroud)

但是我不理解:

>>> id(1)
1720438512
>>> b = 1
>>> id(b)
1720438512
Run Code Online (Sandbox Code Playgroud)

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

或者,从相反的方向显示我的耳朵:

>>> id(something_1)
some unique memory address
>>> id(something_2)
some unique memory address
>>> ...
Run Code Online (Sandbox Code Playgroud)

在什么时候重新分配内存?那就是在那个时候

>>> my_variable = something_1
>>> id(my_variable)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ley 5

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

当您编写类似的内容时:

>>> id(1000)
140497411829680
Run Code Online (Sandbox Code Playgroud)

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

通常,您无法预测何时会发生重用,但是在我的Python Shell中,它会相当一致地发生:

>>> id(1000)
140697307078576
>>> id(1001)
140697307078576
>>> id(1002)
140697307078576
>>> id(1003)
140697307078576
Run Code Online (Sandbox Code Playgroud)

您会看到在创建每个新整数时,一次又一次使用相同的内存地址。但是,如果您防止引用计数下降到零,则可以看到使用了新的内存:

>>> a = 1000
>>> id(a)
140697307078576
>>> b = 1001
>>> id(b)
140697306008368
Run Code Online (Sandbox Code Playgroud)

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