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 ()는 그러한 함수 중 하나입니다.