对Python的id()感到困惑
我能理解以下的定义:
每个对象都有一个身份、一个类型和一个值。对象的身份一旦创建就不会改变;你可以把它想象成对象在内存中的地址。
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 个回答
一般来说,当你使用一个整数、字符串或其他任何字面量时,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
)。这是一个优化,目的是避免重复创建和销毁常用的整数。