1

理论题

每个 Python shell 都有无需声明或创建即可使用的对象,例如 True、False、""、[]、{},以及整数和浮点数的任意组合。

这意味着在任何时候,您都可以获得他们的 ID。

id(1)
id(42)
id('')

等等

当然,如果您尝试获取未声明对象的 id,您会得到:

id(myobject1)

Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    id(myobject1)
NameError: name 'myobject1' is not defined

由于 myobject1 没有指向任何内容,因此它没有被定义,也没有 id。

然而,有无限数量的对象可以在没有声明的情况下使用,因为数字系统是无限的。因此,在程序中以某种身份使用之前,所有未声明的对象都不可能拥有 id。

这些对象何时获得分配的 ID?

4

3 回答 3

2

您误解了分配的概念。

在分配中,您将对象绑定到名称。所有分配给的名称都可以以任何想要的方式使用,未分配的名称不存在,因此不能指向任何东西(包括“无处”)。

id(spam)您询问spam指向的对象,然后询问其ID。

不存在的名称spam没有分配给其 ID 可以查询的对象。

OTOH,每个对象都有一个 ID。

于 2012-12-13T15:45:14.703 回答
2

我将尝试一一反驳这些误解。这可能有用也可能没用。

每个 Python shell 都有无需声明即可使用的对象

Python 中没有“声明”对象的概念。因此,对象既没有被声明也没有被声明。

或创建

您不能使用未创建的对象。所有存在的对象都有 id。

真假

True并且False是存在的对象。他们有身份证。

""、[]、{} 以及整数和浮点数的任意组合。

执行代码时,文字变成对象。字的组合,{}本质上是一种说法的捷径dict()。创建的对象有 id。

当然,如果您尝试获取未声明对象的 id,则会得到 NameError。

否。 NameError 是当您尝试使用尚未定义的名称时。

由于 myobject1 没有指向任何内容

错了,它并没有“指向任何东西”。它没有被定义。它不能指向任何东西,它不存在。

并且没有身份证。

名称没有 ID。对象有 id。当你说

>>> foo = 5
>>> id(foo)
137396064

您不是在询问 name 的 id foo。您正在询问名称 foo 分配给的对象的 id。如果你现在重新分配 foo,你会得到另一个 id:

>>> bar = foo
>>> foo = "string"
>>> id(foo)
3075254336
>>> id(bar)
137396064

对象的 id 保持不变,名称已重新分配。

然而,有无数的对象可以在没有声明的情况下使用

不,他们不是。

于 2012-12-13T16:08:14.277 回答
0

对于您关于何时42成为分配的 id 的问题:您可以考虑42be int(42)。它为值为 42 的整数分配内存。构造整数后,将其传递给id()函数。之后,整数的引用计数递减,因此被释放。

从技术上讲,对象的 id 只不过是它在内存中的地址。

于 2012-12-13T16:10:02.717 回答