通过ID获取对象?
假设我有一个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模块 让你可以保持对对象的引用,比如字典引用和代理,但这些引用不会被计算在引用计数里。它们就像是符号链接。