首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么id(id)和id(Id)总是返回相同的值,而id(Id))“循环”超过3个值?

为什么id(id)和id(Id)总是返回相同的值,而id(Id))“循环”超过3个值?
EN

Stack Overflow用户
提问于 2014-08-14 23:08:16
回答 2查看 84关注 0票数 1

出现在python 2.7.8中。不发生在3.4.1。

例子:

代码语言:javascript
复制
>>> id(id)
140117478913736
>>> id(id)
140117478913736
>>> id(id)
140117478913736
>>> id(id(id))
38775176
>>> id(id(id))
38775176
>>> id(id(id))
38775176
>>> id(id(id(id)))
38775152
>>> id(id(id(id)))
38775224
>>> id(id(id(id)))
38775176

..。最后一行总是返回这三个值,遍历它们。

5 "id“:总是相同的值。

6 "id“:三个值的循环。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 23:30:17

id()的结果在传入的对象的持续时间内保证是相同的。

因此,只要参数id存在,id就会产生相同的结果。那就是永远。

但是,只要存在id(id(id))的结果,id(id)就只能产生相同的结果,但是这个对象只是临时的。它可以巧合地多次返回相同的结果,但您不能依赖这种行为。我可以证明:

代码语言:javascript
复制
>>> id(id(id))
12345
>>> id(id(id))
12345 # coincidence!
>>> [1, 2, 3]
[1, 2, 3]
>>> id(id(id))
98765 # now it's different!

因此,您所看到的只是Python实现中分配模式中的巧合。

为什么是三圈?

在您的Python中,我猜这种情况正在发生。左边是正在计算的表达式,右边是堆。

代码语言:javascript
复制
id(id(id))          [ ]
id(140117478913736) [ 140117478913736 ]           # evaluate
38775176            [ 140117478913736, 38775176 ] # evaluate
                    [ _ , 38775176 ]              # decref

id(id(id))          [ _ , 38775176 ]
id(140117478913736) [ 140117478913736, 38775176 ] # evaluate

您可以在id(id(id))中看到,每个对象都占据堆中的第一个槽,因为id(id)总是进入相同的槽,所以总是得到相同的结果.除非你分配了什么!

票数 4
EN

Stack Overflow用户

发布于 2014-08-14 23:28:41

在单个执行实例中,id(id)必须是常量,因为id不是一些临时对象。

使用嵌套id调用的字符串的任何其他表达式实际上都不需要有一致的结果,因为您试图获得某个整数的id,该整数的生存期在整个表达式计算后结束,而id恰好是文档中提到的对象的内存地址。不过,这是一个实现细节,所以您不应该指望它。然而,这些细节是你得到这些结果的原因。

在Python3.4.1中没有发生这种情况,这一事实只是告诉您,这些动态对象的内存分配和去分配模式是不同的。这不重要。这些信息对你没有任何帮助。

重要的是,id为所有具有活动寿命的对象提供一个唯一的标识符。有关此标识符的含义的详细信息与程序员无关。

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

https://stackoverflow.com/questions/25318978

复制
相关文章

相似问题

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