Как я могу получить список ссылок на объект в Python?

Все:

a = 1 b = a c = b 

Теперь я хочу получить список объектов 1 тегами, которые являются [a, b, c] . Как я могу это сделать?

Кстати, как назвать переменную «а» здесь официально? Я знаю, что до сих пор это «объектный тег» для объекта, но я понятия не имею, что это за термин.

Благодаря!

зачем мне это нужно:

 a = b = c = 1 print a, b, c 1 1 1 a = 2 print a, b, c 2 1 1 

на другом языке, таком как C, a, b, c, должно быть 2, если я повторно назначу a = 2, но в python нет такой вещи, как ссылка, поэтому единственный способ изменить все значение abc: a = b = c = 2, насколько я знаю, поэтому цель – получить всю ссылку на объект.

То, что вы просите, не очень практично и не возможно. Вот один безумный способ сделать это:

 >>> a = 1 >>> b = a >>> c = b >>> locals() {'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} >>> [key for key, value in locals().items() if value == 1] ['a', 'c', 'b'] >>> globals() {'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} >>> [key for key, value in globals().items() if value == 1] ['a', 'c', 'b'] 

Как вы можете видеть, их невозможно найти.

 >>> sys.getrefcount(1) 791 >>> sys.getrefcount(2) 267 >>> sys.getrefcount(3) 98 

Я хотел бы прояснить некоторые дезинформации здесь. Это не имеет ничего общего с тем, что «ints неизменяемы». Когда вы пишете a = 2 вы назначаете a и одно для чего-то другого – оно не влияет на b и c .

Если бы вам нужно было изменить свойство a , то это повлияло бы на b и c . Надеюсь, этот пример лучше иллюстрирует то, о чем я говорю:

 >>> a = b = c = [1] # assign everyone to the same object >>> a, b, c ([1], [1], [1]) >>> a[0] = 2 # modify a member of a >>> a, b, c ([2], [2], [2]) # everyone gets updated because they all refer to the same object >>> a = [3] # assign a to a new object >>> a, b, c ([3], [2], [2]) # b and c are not affected 

Я думаю, вас может заинтересовать objgraph . Он позволяет перемещаться по графику объекта в памяти или выгружать PNG вашего графа объектов. Это полезно для отладки утечек памяти.

См. Эту страницу: http://mg.pov.lt/objgraph/

Невозможно найти все ссылки на данный объект в Python. Невозможно найти все объекты или все ссылки в Python. (Функция CPython gc.get_objects делает это, но не переносима в реализациях Python.)

Вы можете использовать dir() или locals() чтобы найти все переменные, которые существуют в некоторой области в программе. Но если объекты были определены в других местах, вы могли бы пропустить их с помощью этого метода.

Прежде всего в C, «=» является присвоением значения и не создает ссылку. Более конкретно, когда вы пишете a = b = 1, это происходит.

(1) b = 1 оценивается, присваивает 1 b и затем возвращает 1, поэтому выражение становится a = 1

(2) оценивается a = 1, присваивает значение 1 b и затем возвращает 1, который нигде не используется.

Тогда a = 1 изменяется только как ожидалось.

В python вещи немного сложнее, поскольку каждая переменная является ссылкой, но она обрабатывает числа по-разному, потому что они неизменяемы. Короче говоря, когда вы пишете a = 1 и b = 1, тогда a is b возвращает True. Но изменение одного не изменит другого.

Однако этого не происходит с объектами, с ними ссылка работает, как ожидалось. Поэтому, если вы хотите сделать то, что описываете, возможно, вам следует определить новый объект, который содержит требуемое значение, и назначить его переменной.

Посмотрите на пиджак . Его функция replace_all_refs, похоже, работает довольно хорошо, чтобы заменить все ссылки на объект. Примечание. Не работает с строковыми объектами.