我这些天一直在玩Python,我意识到Python如何将id(地址)分配给新实例(int和list)。
例如,如果我使用数字(或两个不同的数字)保持调用id函数,则返回相同的结果。 e.g。
>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12342) #different number here, yet still same id
4298287048
当我先声明变量然后用它调用id()时,结果就像这样交替。
>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448
>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448
有人可以解释一下这背后的Python工作吗?另外,是否有一本书或一个网站,我可以阅读有关Python的这一部分(分配内存地址,幕后工作等),因为我可以从python documentation
中找到它。答案 0 :(得分:9)
您正在创建一个新对象,没有任何其他引用,并且在id()
完成对象后再次销毁对象时,Python会重新使用内存位置。在CPython中,id()
的结果发生作为对象的内存位置。来自id()
function documentation:
CPython实现细节:这是内存中对象的地址。
第id(12345)
行创建了一个新的int()
实例;因为它被绑定为id()
的参数,它有1个引用它。 id()
确定内存位置,并返回该结果。在返回时,清除参数并将int()
实例的引用计数降为0,Python将其清除。释放了内存。
下一行创建一个新的int()
实例。可以在同一位置使用内存,因此可以重复使用。
相反,当您首先绑定新对象时没有名称时,您创建了对该对象的额外引用,并且它未被清除。内存未释放,新对象必须使用新的内存地址。
此部分也记录在案,同样来自id()
文档:
这是一个整数(或长整数),对于此对象的生命周期,它保证是唯一且常量。生命周期不重叠的两个对象可能具有相同的
id()
值。
强调我的。
重新绑定时(x = []
已设置x
时)Python 第一个会创建一个新对象,然后重新绑定x
指向那个新对象。在创建新列表之后,这将取消绑定旧列表。这意味着在创建新列表对象时,旧内存位置仍处于占用状态。
将其映射到特定步骤:
id() == 4301901696
创建对象。4301901696
绑定到x
- > 4301901696
的引用计数为1。id() == 4301729448
创建对象。4301901696
未加入x
。 4301901696
的引用计数降为0,并从内存中清除。4301729448
绑定到x
。 4301729448
的引用计数为1。4301901696
为空,因此新对象获得id() == 4301901696
。4301729448
未加入x
。 4301729448
的引用计数降为0,并从内存中清除。4301901696
绑定到x
。 4301901696
的引用计数为1。这也是文档的一部分,assignment statement documenation告诉您在哪个订单分配中发生:
赋值语句计算表达式列表 [...] ,并从左到右将单个结果对象分配给每个目标列表。
其中表达式列表是=
符号右侧的所有内容。