Python对新实例的引用

Python对新实例的引用,python,python-2.7,Python,Python 2.7,最近我一直在玩Python,我了解到Python如何将id(地址)分配给新实例(int和list)的一些有趣的方式 例如,如果我使用一个数字(或两个不同的数字)保留call id函数,它将返回相同的结果。e、 g >>> id(12345) 4298287048 >>> id(12345) 4298287048 >>> id(12345) 4298287048 >>> id(12342) #different number

最近我一直在玩Python,我了解到Python如何将id(地址)分配给新实例(int和list)的一些有趣的方式

例如,如果我使用一个数字(或两个不同的数字)保留call 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的这一部分(分配内存地址、幕后工作等),因为我从中几乎找不到什么东西。你正在创建一个新对象,没有任何其他参考,当对象在
id()之后再次被销毁时,Python会重新使用内存位置
已完成。在CPython中,
id()
的结果恰好是对象的内存位置。从:

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

id(12345)
创建一个新的
int()
实例;因为它是作为
id()
的参数绑定的,所以它有一个引用
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
  • 等等
  • 这也是文档的一部分,告诉您订单分配发生在:

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


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

    在一个示例中使用大整数,在另一个示例中使用列表是否重要?没有特殊原因。我只是碰巧使用了int和list。我知道Python会保存特定范围内的数字的规范实例,比如-5到255。所以我用更大的数字来测试。但是由于python中的所有东西都是第一类对象,我假设其他对象的行为也是一样的?除了内存位置之外,有没有其他python实现使用
    id
    的实现?似乎有很多方法可以唯一地标识对象…@wim:IronPython使用生成(顺序)ID。Jython(这并不奇怪,因为他们有相同的原作者)。