Python对新实例的引用
最近我一直在玩Python,我了解到Python如何将id(地址)分配给新实例(int和list)的一些有趣的方式 例如,如果我使用一个数字(或两个不同的数字)保留call id函数,它将返回相同的结果。e、 gPython对新实例的引用,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
>>> 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
以指向该新对象。这将在创建新列表后解除旧列表的绑定。这意味着在创建新的列表对象时,旧的内存位置仍然被占用
要将其映射到特定步骤,请执行以下操作:
4301901696
绑定到x
->4301901696
的参考计数为14301901696
与x
解除绑定。4301901696
的参考计数降至0,并从内存中清除4301729448
绑定到x
。4301729448
的参考计数为14301901696
为空,因此新对象将获得id()==4301901696
4301729448
与x
解除绑定。4301729448
的参考计数下降到0,并从内存中清除4301901696
绑定到x
。4301901696
的参考计数为1表达式列表是
=
符号右侧的所有内容。在一个示例中使用大整数,在另一个示例中使用列表是否重要?没有特殊原因。我只是碰巧使用了int和list。我知道Python会保存特定范围内的数字的规范实例,比如-5到255。所以我用更大的数字来测试。但是由于python中的所有东西都是第一类对象,我假设其他对象的行为也是一样的?除了内存位置之外,有没有其他python实现使用id
的实现?似乎有很多方法可以唯一地标识对象…@wim:IronPython使用生成(顺序)ID。Jython(这并不奇怪,因为他们有相同的原作者)。