Odpowiedź Roba (większość głosowała powyżej) jest poprawna. Chciałbym dodać, że w niektórych sytuacjach użycie identyfikatorów jest przydatne, ponieważ pozwala na porównanie obiektów i znalezienie, które obiekty odnoszą się do twoich obiektów.
Ta ostatnia zwykle pomaga na przykład w debugowaniu dziwnych błędów, w których zmienne obiekty są przekazywane jako parametr do wypowiadania klas i są przypisywane do lokalnych zmiennych w klasie. Mutowanie tych obiektów spowoduje mutację vars w klasie. Przejawia się to dziwnym zachowaniem, w którym wiele rzeczy zmienia się w tym samym czasie.
Niedawno miałem ten problem z aplikacją Python / Tkinter, w której edycja tekstu w jednym polu wprowadzania tekstu zmieniała tekst w innym podczas pisania :)
Oto przykład, jak możesz użyć funkcji id () do śledzenia, gdzie znajdują się te odwołania. Z całą pewnością nie jest to rozwiązanie obejmujące wszystkie możliwe przypadki, ale masz pomysł. Ponownie identyfikatory są używane w tle i użytkownik ich nie widzi:
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()) )
WYNIK:
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'}
Podkreślenia w nazwach zmiennych służą do zapobiegania kolizji nazw. Funkcje używają argumentu „skąd”, aby umożliwić im rozpoczęcie wyszukiwania odniesień. Ten argument jest wypełniany przez funkcję, która wyświetla wszystkie nazwy w danej przestrzeni nazw. Globals () jest jedną z takich funkcji.