Как получить доступ к переменной по идентификатору?

Возможный дубликат:
Получить объект по id ()?

>>> var = 'I need to be accessed by id!'
>>> address = id(var)
>>> print(address)
33003240

Есть ли способ использовать адрес var в памяти, предоставленный id(), для доступа к значению var?

UPD:
Я также хочу сказать, что если это невозможно сделать в стандартном Python, было бы также интересно, если бы это каким-то образом можно было реализовать путем взлома C ++ внутренностей Python.

UPD2: Также было бы интересно узнать, как изменить значение var.


person Gill Bates    schedule 10.01.2013    source источник
comment
Вы не можете. Возвращаемое значение id() не является ссылкой. Тот факт, что cpython здесь возвращает адрес памяти, является деталью реализации, и использование его в качестве ссылки не является целью функции.   -  person Martijn Pieters    schedule 10.01.2013
comment
Зачем вам это нужно делать, используя имя какого-либо божества? Martijn прав, даже если вы могли бы как-то взломать его в CPython, это всего лишь деталь реализации.   -  person pcalcao    schedule 10.01.2013
comment
почему ты хочешь сделать это?   -  person Keith    schedule 10.01.2013
comment
Чего вы пытаетесь достичь? Вероятно, есть и другие способы добиться того, что вам нужно.   -  person Martijn Pieters    schedule 10.01.2013
comment
Первая цель: развлечение; Во-вторых: передача по ссылке - иногда это необходимо для большей гибкости, несмотря на то, что он не питонический. Это дзен-вопрос, никакого практического опыта.   -  person Gill Bates    schedule 10.01.2013
comment
Также не имеет смысла, что для получения id объекта у вас должна быть ссылка на имя, чтобы сделать это ... Итак, в этот момент просто держите имя висящим, а не какую-то запутанную информацию. прямой способ вернуть его ...   -  person Jon Clements♦    schedule 10.01.2013
comment
Если это только для развлечения, вы можете создать идентификатор для карты объекта: {id(v):v for k,v in globals().iteritems()}   -  person root    schedule 10.01.2013
comment
@MartijnPieters Я хотел тебе ответить, но потом забыл. Адрес памяти - это адрес памяти - какой бы язык программирования мы ни использовали - адрес памяти всегда остается тем, что есть - адресом, где хранится фрагмент данных. Переменная в Python также имеет свой адрес, но id() возвращает адрес данных, на которые указывает переменная Python. В Python все переменные - это просто скрытые указатели.   -  person Gill Bates    schedule 26.01.2013
comment
Возможно. См. Принятый ответ на повторяющийся вопрос Можно ли разыменовать переменную идентификаторы?   -  person martineau    schedule 11.03.2017


Ответы (1)


Решение только для вашего случая:

var = 'I need to be accessed by id!'
address = id(var)
print(address)
var2 = [x for x in globals().values() if id(x)==address]

Он также работает изнутри такой функции, как

def get_by_address(address):
    return [x for x in globals().values() if id(x)==address]

var = 'I need to be accessed by id!'
address = id(var)
print(address)
var2 = get_by_address(address)

Но, как отмечали другие: Сначала убедитесь, что нет лучшего решения, которое лучше соответствует вашим потребностям

person Thorsten Kranz    schedule 10.01.2013
comment
См. Также stackoverflow.com/a/1396690/514485. И, как и почти все остальные, я предупреждаю вас, что вы, вероятно, не хотите / не должны этого делать. - person jimhark; 10.01.2013