La risposta di Rob (la più votata sopra) è corretta. Vorrei aggiungere che in alcune situazioni l'uso degli ID è utile in quanto consente il confronto degli oggetti e la ricerca di quali oggetti si riferiscono ai propri oggetti.
L'ultimo di solito ti aiuta, ad esempio, a eseguire il debug di strani bug in cui gli oggetti mutabili vengono passati come parametri per dire classi e sono assegnati a variabili locali in una classe. La modifica di questi oggetti muterà le variabili in una classe. Questo si manifesta in uno strano comportamento in cui più cose cambiano allo stesso tempo.
Recentemente ho avuto questo problema con un'app Python / Tkinter in cui la modifica del testo in un campo di immissione del testo cambiava il testo in un altro mentre digitavo :)
Ecco un esempio di come potresti usare function id () per tracciare dove si trovano quei riferimenti. Con tutti i mezzi questa non è una soluzione che copre tutti i casi possibili, ma hai l'idea. Anche in questo caso gli ID vengono utilizzati in background e l'utente non li vede:
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()) )
PRODUZIONE:
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'}
I trattini di sottolineatura nei nomi delle variabili vengono utilizzati per prevenire la collisione dei nomi. Le funzioni utilizzano l'argomento "fromwhere" in modo che tu possa far sapere loro da dove iniziare la ricerca dei riferimenti. Questo argomento è riempito da una funzione che elenca tutti i nomi in un determinato spazio dei nomi. Globals () è una di queste funzioni.