通过ID获取对象?

157 投票
7 回答
112489 浏览
提问于 2025-04-15 14:10

假设我有一个Python对象的ID,我是通过执行 id(thing) 得到这个ID的。那我该怎么通过这个ID再找到 thing 呢?

7 个回答

45

你可以使用 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")
244

如果这个对象还在的话,可以通过 ctypes 来实现:

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

输出结果:

hello world

如果你不确定这个对象是否还在,那就可能会出现一些不确定的情况,比如程序崩溃或者更糟糕的情况,所以一定要小心。

46

你可能想考虑用其他方式来实现这个功能。你知道有一个叫做weakref的模块吗?

(编辑过) Python的 weakref模块 让你可以保持对对象的引用,比如字典引用和代理,但这些引用不会被计算在引用计数里。它们就像是符号链接。

撰写回答