这些天我一直在使用Python,我认识到Python如何为新实例(int和list)分配id(address)的方式很有趣。
例如,如果我保留一个数字(或两个不同的数字)的调用id函数,它返回相同的结果。例如:
>>> 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文档中找不到多少。
发布于 2014-06-06 16:15:33
您正在创建一个没有任何其他引用的新对象,当对象在id()
完成后再次被销毁时,和Python将重新使用该内存位置。在CPython中,id()
的结果恰好是对象的内存位置。来自功能文档
CPython implementation detail:这是内存中对象的地址。
行id(12345)
创建了一个新的int()
实例;因为它是作为参数绑定到id()
的,所以它有一个引用。id()
确定内存位置,并返回结果。在返回过程中,参数被清理,int()
实例的引用计数下降到0,并且Python清理它。内存被释放了。
下一行将创建一个新的int()
实例。在同一个位置有可用的内存,因此可以重用它。
相反,当您首先绑定新的对象时--没有名称--则创建了对该对象的额外引用,而它没有被清除。内存未被释放,新对象必须使用新的内存地址。
这部分也有文档记录,同样来自id()
文档:
这是一个整数(或长整数),它保证该对象在其生存期内是唯一且常量的。具有不重叠生存期的两个对象可能具有相同的
id()
值.。
强调我的。
当重新绑定(当x = []
已经设置x
时) Python 首先创建一个新对象时,然后重新绑定x
以指向该新对象。这将在创建新列表后解除对旧列表的绑定。这意味着在创建新list对象时,旧内存位置仍被占用。
要将其映射到具体步骤:
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。这也是文档的一部分,赋值语句文档化将告诉您在以下文件中发生的订单分配:
赋值语句计算表达式列表..。并将单个结果对象从左到右分配给每个目标列表。
其中表达式列表是=
符号右侧的所有内容。
https://stackoverflow.com/questions/24086367
复制相似问题