出现在python 2.7.8中。不发生在3.4.1。
例子:
>>> 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“:三个值的循环。
发布于 2014-08-14 23:30:17
id()的结果在传入的对象的持续时间内保证是相同的。
因此,只要参数id存在,id就会产生相同的结果。那就是永远。
但是,只要存在id(id(id))的结果,id(id)就只能产生相同的结果,但是这个对象只是临时的。它可以巧合地多次返回相同的结果,但您不能依赖这种行为。我可以证明:
>>> 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中,我猜这种情况正在发生。左边是正在计算的表达式,右边是堆。
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)总是进入相同的槽,所以总是得到相同的结果.除非你分配了什么!
发布于 2014-08-14 23:28:41
在单个执行实例中,id(id)必须是常量,因为id不是一些临时对象。
使用嵌套id调用的字符串的任何其他表达式实际上都不需要有一致的结果,因为您试图获得某个整数的id,该整数的生存期在整个表达式计算后结束,而id恰好是文档中提到的对象的内存地址。不过,这是一个实现细节,所以您不应该指望它。然而,这些细节是你得到这些结果的原因。
在Python3.4.1中没有发生这种情况,这一事实只是告诉您,这些动态对象的内存分配和去分配模式是不同的。这不重要。这些信息对你没有任何帮助。
重要的是,id为所有具有活动寿命的对象提供一个唯一的标识符。有关此标识符的含义的详细信息与程序员无关。
https://stackoverflow.com/questions/25318978
复制相似问题