Robs Antwort (die meisten stimmten oben) ist richtig. Ich möchte hinzufügen, dass die Verwendung von IDs in einigen Situationen nützlich ist, da hiermit Objekte verglichen und festgestellt werden können, welche Objekte auf Ihre Objekte verweisen.
Letzteres hilft Ihnen normalerweise beim Debuggen von seltsamen Fehlern, bei denen veränderbare Objekte als Parameter für Klassen übergeben und lokalen Variablen in einer Klasse zugewiesen werden. Durch das Mutieren dieser Objekte werden vars in einer Klasse mutiert. Dies äußert sich in einem seltsamen Verhalten, bei dem sich mehrere Dinge gleichzeitig ändern.
Vor kurzem hatte ich dieses Problem mit einer Python / Tkinter-App, bei der das Bearbeiten von Text in einem Texteingabefeld den Text in einem anderen während der Eingabe geändert hat :)
Hier ist ein Beispiel, wie Sie die Funktion id () verwenden können, um zu verfolgen, wo sich diese Referenzen befinden. Auf jeden Fall ist dies keine Lösung, die alle möglichen Fälle abdeckt, aber Sie haben die Idee. Wieder werden IDs im Hintergrund verwendet und der Benutzer sieht sie nicht:
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()) )
AUSGABE:
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'}
Unterstriche in Variablennamen werden verwendet, um Namenskollisionen zu verhindern. Funktionen verwenden das Argument "fromwhere", damit Sie ihnen mitteilen können, wo sie mit der Suche nach Referenzen beginnen sollen. Dieses Argument wird von einer Funktion gefüllt, die alle Namen in einem bestimmten Namespace auflistet. Globals () ist eine solche Funktion.