Python引用一个新实例交替

时间:2014-06-06 16:14:20

标签: python python-2.7

我这些天一直在玩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

中找到它。

1 个答案:

答案 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指向那个新对象。在创建新列表之后,这将取消绑定旧列表。这意味着在创建新列表对象时,旧内存位置仍处于占用状态。

将其映射到特定步骤:

  1. 您使用id() == 4301901696创建对象。
  2. 4301901696绑定到x - > 4301901696的引用计数为1。
  3. 您使用id() == 4301729448创建对象。
  4. 4301901696未加入x4301901696的引用计数降为0,并从内存中清除。
  5. 4301729448绑定到x4301729448的引用计数为1。
  6. 您创建了一个新对象,4301901696为空,因此新对象获得id() == 4301901696
  7. 4301729448未加入x4301729448的引用计数降为0,并从内存中清除。
  8. 4301901696绑定到x4301901696的引用计数为1。
  9. 这也是文档的一部分,assignment statement documenation告诉您在哪个订单分配中发生:

      

    赋值语句计算表达式列表 [...] ,并从左到右将单个结果对象分配给每个目标列表。

    其中表达式列表=符号右侧的所有内容。