Python引用一个新实例交替

Yol*_*and 6 python python-2.7

这些天我一直在玩Python,我意识到Python如何将id(地址)分配给新实例(int和list).

例如,如果我使用数字(或两个不同的数字)保持调用id函数,则返回相同的结果.例如

>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12342) #different number here, yet still same id
4298287048
Run Code Online (Sandbox Code Playgroud)

此外,当我先声明变量然后用它调用id()时,结果就像这样交替.

>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448
>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这背后的Python工作吗?还有,有一本书或一个网站,我可以阅读有关Python的这一部分(分配内存地址,幕后工作等),因为我从python文档中找不到什么

Mar*_*ers 9

您正在创建一个没有任何其他引用的新对象,并且当对象在id()完成后再次销毁时,Python会重新使用内存位置.在CPython中,结果id() 恰好是对象的内存位置.从id()功能文档:

CPython实现细节:这是内存中对象的地址.

该行id(12345)创建了一个新int()实例; 因为它被绑定为一个参数,id()它有1个引用它.id()确定内存位置,并返回该结果.在返回时,参数被清理,int()实例的引用计数降为0,Python将其清理干净.内存被释放.

下一行创建一个新int()实例.在同一位置有可用内存,因此可以重复使用.

相反,当您首先绑定新对象时没有名称时,您创建了对该对象的额外引用,并且它未被清除.内存未释放,新对象必须使用新的内存地址.

从文档中再次记录了这一部分id():

这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的id()值.

强调我的.

重新绑定x = []x(已经设置),Python 首先创建一个新对象,然后重新绑定x以指向该新对象.创建新列表,这将取消绑定旧列表.这意味着在创建新列表对象时仍会占用旧的内存位置.

要将其映射到特定步骤:

  1. 你用它创建一个对象id() == 4301901696.
  2. 4301901696被绑定x- >引用计数为43019016961.
  3. 你用它创建一个对象id() == 4301729448.
  4. 4301901696是没有约束的x.4301901696丢弃的引用计数为0并从内存中清除.
  5. 4301729448必然会x.引用计数为43017294481.
  6. 您创建一个新对象,4301901696为空,以便新对象获取id() == 4301901696.
  7. 4301729448是没有约束的x.4301729448丢弃的引用计数为0并从内存中清除.
  8. 4301901696必然会x.引用计数为43019016961.
  9. 等等

这也是文档的一部分,赋值语句文档告诉您在哪个订单分配中:

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

其中表达名单是对的右手边的一切=符号.