Как я могу получить список ссылок на объект в Python? - PullRequest
8 голосов
/ 03 декабря 2010

Все:

a = 1
b = a
c = b

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

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

Спасибо!

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

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 нет такой вещи, как reference, поэтому единственный способ изменить все значение abc Насколько я знаю, a = b = c = 2, поэтому намеревался получить всю ссылку на объект.

Ответы [ 7 ]

10 голосов
/ 03 декабря 2010

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

>>> sys.getrefcount(1)
791
>>> sys.getrefcount(2)
267
>>> sys.getrefcount(3)
98
7 голосов
/ 01 июля 2012

Я бы хотел уточнить здесь некоторую дезинформацию. Это на самом деле не имеет ничего общего с тем фактом, что «целые неизменны». Когда вы пишете a = 2, вы назначаете только a и 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
4 голосов
/ 26 августа 2012

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

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

2 голосов
/ 03 декабря 2010

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

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

2 голосов
/ 03 декабря 2010

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

>>> 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']
1 голос
/ 26 октября 2011

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

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

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

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

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

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

0 голосов
/ 14 августа 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...