La respuesta de Rob (la más votada arriba) es correcta. Me gustaría agregar que, en algunas situaciones, el uso de ID es útil ya que permite comparar objetos y encontrar qué objetos se refieren a sus objetos.
El último generalmente lo ayuda, por ejemplo, a depurar errores extraños donde los objetos mutables se pasan como parámetro para decir clases y se asignan a vars locales en una clase. La mutación de esos objetos mutará vars en una clase. Esto se manifiesta en un comportamiento extraño donde varias cosas cambian al mismo tiempo.
Recientemente tuve este problema con una aplicación Python / Tkinter donde la edición de texto en un campo de entrada de texto cambiaba el texto en otro mientras escribía :)
Aquí hay un ejemplo de cómo puede usar la función id () para rastrear dónde están esas referencias. Por supuesto, esta no es una solución que cubra todos los casos posibles, pero entiendes la idea. Nuevamente, las ID se utilizan en segundo plano y el usuario no las ve:
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()) )
SALIDA:
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'}
Los guiones bajos en los nombres de las variables se utilizan para evitar colisiones de nombres. Las funciones utilizan el argumento "desde donde" para que pueda hacerles saber dónde empezar a buscar referencias. Este argumento se completa con una función que enumera todos los nombres en un espacio de nombres dado. Globals () es una de esas funciones.