对Python的id()感到困惑

5 投票
1 回答
3423 浏览
提问于 2025-05-10 15:13

我能理解以下的定义:

每个对象都有一个身份、一个类型和一个值。对象的身份一旦创建就不会改变;你可以把它想象成对象在内存中的地址。is 操作符用来比较两个对象的身份;而 id() 函数返回一个整数,表示它的身份。

我认为上面的定义在“某个东西”被创建时是有效的,比如:

>>> 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?

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

8

一般来说,当你使用一个整数、字符串或其他任何字面量时,Python会在内存中为你创建一个新的对象。这个对象在它存在的期间会有一个固定的id,也就是说,只要它的引用计数不为零,它的id就不会改变。

比如,当你写下这样的代码:

>>> id(1000)
140497411829680

Python会创建一个整数1000,并返回它的id(在CPython中,这个id就是对象在内存中的地址)。完成这个操作后,整数对象1000的引用计数变为零,它就会被删除。这就确保了你不能通过写id(something)来不断占用内存(而不给这个对象绑定任何变量名)。

通常情况下,你无法预测何时会发生对象的重用,但在我的Python环境中,这种情况相当一致:

>>> 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)。这是一个优化,目的是避免重复创建和销毁常用的整数。

撰写回答