未声明的对象何时获得ID



理论问题

每个Python外壳都有可以在不声明或创建的情况下使用的对象,例如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?

您误解了赋值的概念。

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

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

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

OTOH,每个物体都有一个ID。

我将尝试逐一消除误解。这可能有用,也可能不有用。

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

Python中没有"声明"对象的概念。因此,对象既没有声明也没有未声明。

或创建

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

真、假

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

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

执行代码时,文字会变成对象。CCD_ 6的组合在本质上是说CCD_ 7的快捷方式。创建的对象具有id。

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

否。NameError是指您试图使用尚未定义的名称。

由于myobject1不指向

错了,它没有"指向任何东西"。它还没有定义。它不可能指向任何东西,它不存在。

并且没有id。

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

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

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

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

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

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

不,它们不是。

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

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

最新更新