programing

ID()로 개체를 가져오시겠습니까?

mailnote 2023. 7. 20. 22:05
반응형

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

반응형