首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对新实例的Python引用交替

对新实例的Python引用交替
EN

Stack Overflow用户
提问于 2014-06-06 16:14:19
回答 1查看 316关注 0票数 8

这些天我一直在使用Python,我认识到Python如何为新实例(int和list)分配id(address)的方式很有趣。

例如,如果我保留一个数字(或两个不同的数字)的调用id函数,它返回相同的结果。例如:

代码语言:javascript
运行
复制
>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12345)
4298287048
>>> id(12342) #different number here, yet still same id
4298287048

同样,当我首先声明变量,然后用它调用id()时,结果是这样交替的。

代码语言:javascript
运行
复制
>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448
>>> x = []; id(x)
4301901696
>>> x = []; id(x)
4301729448

有人能解释一下这背后的Python工作吗?此外,是否有一本书或网站可以让我读到关于Python的这一部分(分配内存地址,场景工作,等等),因为我在python文档中找不到多少。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象时,旧内存位置仍被占用。

要将其映射到具体步骤:

  1. 使用id() == 4301901696创建一个对象。
  2. 4301901696绑定到x ->引用计数,4301901696为1。
  3. 使用id() == 4301729448创建一个对象。
  4. 4301901696不受x的约束。4301901696的引用计数下降到0,并从内存中清除。
  5. 4301729448被绑定到x4301729448的参考计数为1。
  6. 如果创建一个新对象,则4301901696为空,因此新对象将获得id() == 4301901696
  7. 4301729448不受x的约束。4301729448的引用计数下降到0,并从内存中清除。
  8. 4301901696被绑定到x4301901696的参考计数为1。
  9. 等。

这也是文档的一部分,赋值语句文档化将告诉您在以下文件中发生的订单分配:

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24086367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档