理论问题
每个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?
答案 0 :(得分:2)
你误解了作业的概念。
在赋值时,将对象绑定到名称。分配给的所有名称都可以以任何需要的方式使用,未分配的名称不存在,因此不能指向任何内容(包括“无处”)。
使用id(spam)
,您要求spam
指向的对象,然后询问其ID。
不存在的名称spam
没有分配对象,可以查询其ID。
OTOH,每个对象都有一个ID。
答案 1 :(得分:1)
我会尽力反击误解。这可能有用也可能没用。
每个Python shell都有可以在不声明的情况下使用的对象
Python中没有“声明”对象的概念。因此,对象既未被声明也未被宣布。
或创建
您不能使用未创建的对象。存在的所有对象都有id。
正确,错误
True
和False
是存在的对象。他们有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只不过是它在内存中的地址。