Rob 的回答(上面投票最多)是正确的。我想补充一点,在某些情况下,使用 ID 很有用,因为它允许比较对象并查找哪些对象引用了您的对象。
后者通常可以帮助您调试奇怪的错误,例如将可变对象作为参数传递给类并分配给类中的本地变量。改变这些对象将改变一个类中的变量。这表现为奇怪的行为,其中多个事物同时发生变化。
最近我在一个 Python/Tkinter 应用程序中遇到了这个问题,其中在一个文本输入字段中编辑文本会在我输入时更改另一个文本:)
这是一个示例,说明如何使用函数 id() 来跟踪这些引用的位置。无论如何,这并不是涵盖所有可能情况的解决方案,但您明白了。再次在后台使用 ID,用户看不到它们:
class democlass:
classvar = 24
def __init__(self, var):
self.instancevar1 = var
self.instancevar2 = 42
def whoreferencesmylocalvars(self, fromwhere):
return {__l__: {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
}
for __l__ in dir(self)
if not callable(getattr(self, __l__)) and __l__[-1] != '_'
}
def whoreferencesthisclassinstance(self, fromwhere):
return {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(self)
}
a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2
print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
输出:
My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}
变量名称中的下划线用于防止名称冲突。函数使用“fromwhere”参数,以便您可以让他们知道从哪里开始搜索引用。此参数由一个列出给定名称空间中所有名称的函数填充。Globals() 就是这样一个函数。