ID()로 개체를 가져오시겠습니까?
Python 객체의 ID를 가지고 있다고 가정해 보겠습니다.id(thing)찾는 방법thing내가 받은 ID 번호로 다시?
개체가 계속 있는 경우 다음 작업을 수행할 수 있습니다.
import ctypes
a = "hello world"
print ctypes.cast(id(a), ctypes.py_object).value
출력:
hello world
만약 당신이 그 물체가 아직 그곳에 있는지 모른다면, 이것은 정의되지 않은 행동과 이상한 충돌 또는 더 나쁜 것에 대한 레시피이므로, 조심하세요.
다른 방법으로 구현하는 것을 고려해 보는 것이 좋습니다.당신은 wakref 모듈을 알고 있습니까?
(편집됨)Python weakref 모듈을 사용하면 참조 카운터에서 참조를 카운트하지 않고 개체에 대한 참조, 사전 참조 및 프록시를 유지할 수 있습니다.그것들은 상징적인 연결고리와 같습니다.
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")
간단히 말하면, 당신은 할 수 없습니다.
긴 답변으로, 당신은 ID를 객체에 매핑하기 위한 딕트를 유지할 수 있고, 또는 철저한 검색을 통해 ID를 찾을 수 있습니다.gc.get_objects()그러나 이것은 두 가지 문제 중 하나를 만들 것입니다: 딕트의 참조가 객체를 계속 유지하고 GC를 방지하거나 (만약 그것이 약한 값 딕트이거나 당신이 사용하는 경우)gc.get_objects()) ID가 완전히 다른 개체에 대해 할당 해제 및 재사용될 수 있습니다.
기본적으로, 만약 여러분이 이것을 하려고 한다면, 여러분은 아마도 다른 것을 할 필요가 있을 것입니다.
완성도를 위해 이 모듈을 언급하는 것뿐입니다.Bill Bumgarner의 이 코드는 존재하는 모든 객체를 반복하지 않고 원하는 것을 할 수 있는 C 확장자를 포함합니다.
함수의 코드는 매우 간단합니다.모든 Python 객체는 구조체에 대한 포인터로 C로 표시됩니다.왜냐면id(x)단지 이 구조체의 메모리 주소일 뿐이며, 우리는 처리만 해도 파이썬 객체를 검색할 수 있습니다.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 라이브러리는 이러한 기능을 제공하지만 "전문가 전용"으로 표시됩니다.
이렇게 하면 됩니다.
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))
하지만 저는 좀 더 괜찮은 방법을 사용할 것을 제안합니다.
언급URL : https://stackoverflow.com/questions/1396668/get-object-by-id
'programing' 카테고리의 다른 글
| 오라클 12c에 대한 동면 방언 (0) | 2023.07.20 |
|---|---|
| Python, 객체 생성 (0) | 2023.07.20 |
| ORA-00054: 리소스 사용량이 많고 NOWAIT가 지정된 상태에서 획득 (0) | 2023.07.20 |
| Angular 2에서 앱 구성 요소로 경로 데이터를 가져오는 방법 (0) | 2023.07.20 |
| Firebase 호스팅:SPA의 index.html에 대한 캐싱을 방지하는 방법 (0) | 2023.07.20 |