Получить объект по id ()?

Допустим, у меня есть идентификатор объекта Python, который я получил, выполнив id(thing) . Как мне снова найти thing по номеру, который мне дал?

7 Solutions collect form web for “Получить объект по id ()?”

Вы, вероятно, захотите рассмотреть возможность его реализации по-другому. Вы знаете о модуле weakref?

(Отредактировано) Модуль Python weakref позволяет сохранять ссылки, ссылки на словари и прокси-объекты на объекты без учета этих ссылок в контрольном счетчике. Они похожи на символические ссылки.

Если объект все еще существует, это можно сделать ctypes :

 import ctypes a = "hello world" print ctypes.cast(id(a), ctypes.py_object).value 

вывод:

 hello world 

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

Короткий ответ, вы не можете.

Длинный ответ, вы можете поддерживать идентификатор для сопоставления идентификаторов объектам или искать идентификатор по исчерпывающему поиску gc.get_objects() , но это создаст одну из двух проблем: либо ссылка dict сохранит объект в живых, и предотвратит GC , или (если это сигнал WeakValue или вы используете gc.get_objects() ), идентификатор может быть освобожден и повторно использован для совершенно другого объекта.

В принципе, если вы пытаетесь это сделать, вам, вероятно, нужно сделать что-то по-другому.

Вы можете использовать модуль gc для получения всех объектов, которые в настоящее время отслеживаются сборщиком мусора Python.

 import gc def objects_by_id(id_): for obj in gc.get_objects(): if id(obj) == id_: return obj raise Exception("No found") 

Просто упомянуть этот модуль для полноты. Этот код Билла Бумгарнера включает расширение C, чтобы делать то, что вы хотите, без цикла во всех существующих объектах.

Код для функции довольно прост. Каждый объект Python представлен в C указателем на структуру PyObject . Поскольку id(x) – это только адрес памяти этой структуры, мы можем получить объект Python, рассматривая x как указатель на PyObject , а затем вызывая Py_INCREF чтобы сообщить сборщику мусора, что мы создаем новую ссылку на объект ,

 static PyObject * di_di(PyObject *self, PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args, "l:di", &obj)) return NULL; Py_INCREF(obj); return obj; } 

Если исходный объект больше не существует, то результат не определен. Это может привести к сбою, но оно также может вернуть ссылку на новый объект, который занимает место старого в памяти.

Библиотека eGenix mxTools предоставляет такую ​​функцию, хотя помечена как «только эксперт»: mx.Tools.makeref(id)

Это будет делать:

 a = 0 id_a = id(a) variables = {**locals(), **globals()} for var in variables: exec('var_id=id(%s)'%var) if var_id == id_a: exec('the_variable=%s'%var) print(the_variable) print(id(the_variable)) 

Но я предлагаю реализовать более достойный способ.

  • Python заставляет условие
  • CondingBat Python головоломка приводит к "Timed out"
  • Разница между классом foo и классом foo (object) в Python
  • Удалить буквы из строки
  • Кораблекрушение
  • Как потребовать, чтобы временная метка была заполнена нулями во время проверки в Python?
  • Python - проверка, если несколько строковых записей содержат недопустимые символы
  • Base64 кодирует двоичные загруженные данные в AppEngine
  • Как извлечь из списка объектов список определенного атрибута?
  • Используйте Python os.walk для определения списка файлов
  • Исходный список изменяется в python
  • Python - лучший язык программирования в мире.