Відповідь Роб (більшість голосуючих вище) правильна. Я хотів би додати, що в деяких ситуаціях використання ідентифікаторів є корисним, оскільки дозволяє порівняти об'єкти та знайти, які об’єкти відносяться до ваших об'єктів.
Пізніше зазвичай допомагає вам, наприклад, налагоджувати дивні помилки, коли змінні об’єкти передаються як параметр для класів, що говорять, і призначаються місцевим парам в класі. Вимкнення цих об'єктів буде мутувати vars у класі. Це проявляється в дивній поведінці, коли одночасно змінюється багато речей.
Нещодавно у мене виникла ця проблема з додатком Python / Tkinter, коли редагування тексту в одному полі введення тексту змінило текст в інше, як я вводив :)
Ось приклад того, як ви можете використовувати функцію id (), щоб простежити, де знаходяться ці посилання. Це, безумовно, не є рішенням, яке охоплює всі можливі випадки, але ви отримуєте ідею. Знову ідентифікатори використовуються у фоновому режимі, і користувач їх не бачить:
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()) )
ВИХІД:
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'}
Підкреслення в назвах змінних використовується для запобігання зіткнення імен. Функції використовують аргумент "звідки", щоб ви могли повідомити їм, з чого почати пошук посилань. Цей аргумент заповнюється функцією, яка перераховує всі імена в заданому просторі імен. Глобали () - одна з таких функцій.