理论问题
每个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。
真、假
True
和False
是存在的对象。他们有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只是它在内存中的地址。