什么时候未申报的对象会获得ID?

时间:2012-12-13 15:40:34

标签: python theory

理论问题

每个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?

3 个答案:

答案 0 :(得分:2)

你误解了作业的概念。

在赋值时,将对象绑定到名称。分配给的所有名称都可以以任何需要的方式使用,未分配的名称不存在,因此不能指向任何内容(包括“无处”)。

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

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

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

答案 1 :(得分:1)

我会尽力反击误解。这可能有用也可能没用。

  

每个Python shell都有可以在不声明的情况下使用的对象

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

  

或创建

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

  

正确,错误

TrueFalse是存在的对象。他们有ids。

  

“”,[],{}以及整数和浮点数的任意组合。

文字在执行代码时成为对象。字符{}的组合本质上是说dict()的捷径。创建的对象有id。

  

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

没有。 NameError是指您尝试使用尚未定义的名称时。

  

因为myobject1指向什么

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

  

且没有身份证明。

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

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

您不是要求提供名称foo的ID。您要求分配名称foo的对象的id。如果你现在重新分配foo,你会得到另一个id:

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

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

  

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

不,他们不是。

答案 2 :(得分:0)

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

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