我阅读了the Python 2 docs并注意到了id()
函数:
返回对象的标识。这是一个整数(或长整型),它保证在此对象的生命周期内是唯一且恒定的。生命周期不重叠的两个对象可以具有相同的id()值。
CPython实现细节:这是对象在内存中的地址。
因此,我通过使用带有列表的id()
进行了试验:
>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12
函数返回的整数是多少?它与C中的内存地址是同义词吗?如果是这样,为什么整数不对应于数据类型的大小?
什么时候在实践中使用id()
?
发布于 2013-03-28 03:05:37
你的帖子问了几个问题:
函数返回的数字是多少?
它是“一个整数(或长整型),保证该对象在其生命周期内是唯一且恒定的。”(Python Standard Library - Built-in Functions)一个唯一的数字。没有更多,也没有更少。可以将其视为Python对象的社会保险号或雇员id号。
是否与C中的内存地址相同?
从概念上讲,是的,因为它们都被保证在其有生之年在其宇宙中是唯一的。在Python的一个特定实现中,它实际上是相应C对象的内存地址。
如果是,为什么不立即增加数据类型的大小(我假设它是整型的)?
因为列表不是数组,而列表元素是引用,而不是对象。
我们什么时候才能真正使用id( )
函数?
几乎从来没有。您可以通过比较两个引用的ids来测试它们是否相同,但is
operator一直是推荐的方法。id( )
只有在调试情况下才真正有用。
发布于 2013-03-28 02:59:55
这是内存中对象的位置的标识……
这个例子可能会帮助你更好地理解这个概念。
foo = 1
bar = foo
baz = bar
fii = 1
print id(foo)
print id(bar)
print id(baz)
print id(fii)
> 1532352
> 1532352
> 1532352
> 1532352
这些都指向内存中的相同位置,这就是为什么它们的值是相同的。在本例中,1
只存储一次,任何其他指向1
的内容都将引用该内存位置。
发布于 2013-03-28 03:04:33
id()
确实返回被引用对象的地址(在CPython中),但是您的困惑来自于python列表与C数组有很大的不同。在python列表中,每个元素都是一个引用。因此,您所做的与下面的C代码更相似:
int *arr[3];
arr[0] = malloc(sizeof(int));
*arr[0] = 1;
arr[1] = malloc(sizeof(int));
*arr[1] = 2;
arr[2] = malloc(sizeof(int));
*arr[2] = 3;
printf("%p %p %p", arr[0], arr[1], arr[2]);
换句话说,您打印的是引用中的地址,而不是相对于列表存储位置的地址。
在我的例子中,我发现id()
函数在创建不透明的句柄以便在从C调用python
时返回到C代码中很方便,这样,您就可以很容易地使用字典从它的句柄中查找对象,并且保证它是唯一的。
https://stackoverflow.com/questions/15667189
复制相似问题