La réponse de Rob (la plus votée ci-dessus) est correcte. Je voudrais ajouter que dans certaines situations, l'utilisation d'identifiants est utile car elle permet de comparer des objets et de trouver quels objets font référence à vos objets.
Ce dernier vous aide généralement, par exemple, à déboguer des bogues étranges où des objets mutables sont passés en paramètre pour dire des classes et sont assignés à des variables locales dans une classe. La mutation de ces objets fera muter les variables vars dans une classe. Cela se manifeste par un comportement étrange où plusieurs choses changent en même temps.
Récemment, j'ai eu ce problème avec une application Python / Tkinter où l'édition de texte dans un champ de saisie de texte changeait le texte dans un autre au fur et à mesure que je tapais :)
Voici un exemple sur la façon dont vous pouvez utiliser la fonction id () pour tracer où se trouvent ces références. Ce n'est certainement pas une solution couvrant tous les cas possibles, mais vous voyez l'idée. Encore une fois, les ID sont utilisés en arrière-plan et l'utilisateur ne les voit pas:
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()) )
PRODUCTION:
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'}
Les traits de soulignement dans les noms de variables sont utilisés pour éviter les colisions de noms. Les fonctions utilisent l'argument "fromwhere" pour que vous puissiez leur indiquer par où commencer la recherche de références. Cet argument est rempli par une fonction qui répertorie tous les noms dans un espace de noms donné. Globals () est l'une de ces fonctions.