A resposta de Rob (mais votada acima) está correta. Gostaria de acrescentar que, em algumas situações, o uso de IDs é útil, pois permite a comparação de objetos e descobrir quais objetos se referem a seus objetos.
O último geralmente ajuda você, por exemplo, a depurar bugs estranhos onde objetos mutáveis são passados como parâmetro para dizer classes e são atribuídos a vars locais em uma classe. Transformar esses objetos irá transformar vars em uma classe. Isso se manifesta em um comportamento estranho, em que várias coisas mudam ao mesmo tempo.
Recentemente, tive esse problema com um aplicativo Python / Tkinter em que editar texto em um campo de entrada de texto alterava o texto em outro conforme eu digitava :)
Aqui está um exemplo de como você pode usar a função id () para rastrear onde essas referências estão. Sem dúvida, essa não é uma solução que abranja todos os casos possíveis, mas essa é a ideia. Novamente, os IDs são usados em segundo plano e o usuário não os vê:
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()) )
RESULTADO:
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'}
Sublinhados em nomes de variáveis são usados para prevenir colisões de nomes. As funções usam o argumento "de onde" para que você possa informá-los por onde começar a procurar por referências. Este argumento é preenchido por uma função que lista todos os nomes em um determinado namespace. Globals () é uma dessas funções.