首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >id( )函数用来做什么?

id( )函数用来做什么?
EN

Stack Overflow用户
提问于 2013-03-28 02:58:15
回答 13查看 108.1K关注 0票数 111

我阅读了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()

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2013-03-28 03:05:37

你的帖子问了几个问题:

函数返回的数字是多少?

它是“一个整数(或长整型),保证该对象在其生命周期内是唯一且恒定的。”(Python Standard Library - Built-in Functions)一个唯一的数字。没有更多,也没有更少。可以将其视为Python对象的社会保险号或雇员id号。

是否与C中的内存地址相同?

从概念上讲,是的,因为它们都被保证在其有生之年在其宇宙中是唯一的。在Python的一个特定实现中,它实际上是相应C对象的内存地址。

如果是,为什么不立即增加数据类型的大小(我假设它是整型的)?

因为列表不是数组,而列表元素是引用,而不是对象。

我们什么时候才能真正使用id( )函数?

几乎从来没有。您可以通过比较两个引用的ids来测试它们是否相同,但is operator一直是推荐的方法。id( )只有在调试情况下才真正有用。

票数 164
EN

Stack Overflow用户

发布于 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的内容都将引用该内存位置。

票数 53
EN

Stack Overflow用户

发布于 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代码中很方便,这样,您就可以很容易地使用字典从它的句柄中查找对象,并且保证它是唯一的。

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

https://stackoverflow.com/questions/15667189

复制
相关文章

相似问题

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