比方说,我有一个Python对象的id,我通过id(thing)
进行检索。我怎么找到thing
再次由我给的身份证号码?通过id()获取对象?
回答
你可能要考虑实现它的另一种方式。你意识到weakref模块吗?
(编辑)Python weakref module可让您保留对象的引用,字典引用和代理,而不必在引用计数器中计算这些引用。它们就像符号链接。
有时您不能创建对该对象的弱引用,例如:TypeError:无法创建对'lxml.etree._Element'对象的弱引用 – darkk 2011-06-23 09:17:03
您可以使用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现在可能引用不同的对象。 – chaos 2009-09-08 22:37:59
只要你保留了对象的引用,就不会发生。同样,这通常是一个坏主意。 – 2009-09-08 23:16:53
我同意许多其他评论者:不要这样做。制作你自己的对象字典。 – 2009-09-09 11:26:23
简短的回答,你不能。
很长的答案,你可以保留一个字典,将ID映射到对象,或通过详尽搜索gc.get_objects()
来查找ID,但这会产生以下两个问题之一:或者字典的引用会使对象保持活动状态并阻止GC ,或者(如果它是一个WeakValue字典或者您使用gc.get_objects()
),该ID可能会被重新分配并重新用于完全不同的对象。
基本上,如果你想要做到这一点,你可能需要做一些不同的事情。
我一直打算抛弃对象的'__del__'中的id引用,你认为这会确保事情不会中断吗? – 2009-09-08 22:44:58
+1:同意:不要这样做。只需用适当的键创建一个适当的对象字典 - 你会更快乐。 – 2009-09-08 23:51:03
@ cool-RR:是的,你应该安全。 – chaos 2009-09-09 12:57:13
的eGenix mxTools库不提供这样的功能,但标记为“专家仅”:mx.Tools.makeref(id)
只是提到这个模块的完整性。 This code by Bill Bumgarner包含一个C扩展,可以完成您想要的任何操作,而无需循环遍历每个对象。
该函数的代码非常简单。每个Python对象都用C指向a PyObject
struct。由于id(x)
只是此结构的内存地址,我们可以通过将x
作为指向PyObject
的指针来检索Python对象,然后调用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;
}
如果原始对象不再存在,则结果是未定义的。它可能会崩溃,但它也可能返回一个对旧内存中的旧对象的引用。
如果对象仍然存在,这可以通过ctypes
完成:
import ctypes
a = "hello world"
print ctypes.cast(id(a), ctypes.py_object).value
输出:
hello world
如果你不知道该对象是否仍然存在,这是一个配方不明确的行为和怪异的崩溃或更糟,所以要小心。
这样做:
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))
但我建议实施一个更体面的方式。
- 1. AngularJS:通过工厂ID获取对象
- 2. jQuery通过编号从ID的对象获取对象
- 3. 通过NHibernate中的id或父对象获取子对象?
- 4. 通过嵌套的对象ID获取对象的长度?
- 5. javascript通过ID获取元素与对象ID
- 6. 通过json对象获取对象而不是值“读取”通过json对象
- 7. GWT:在表中通过id获取行的后台对象
- 8. Django数据库查询:如何通过id获取对象?
- 9. 如何通过BLToolkit的id列表获取对象列表?
- 10. 如何通过Excel中的对象获取进程ID#
- 11. 通过其AIR中的`id`获取对象windowedApplication
- 12. 教义1.2如何通过id获取对象?
- 13. 的MongoDB通过寻找另一列值获取对象ID
- 14. 如何通过ruby获取S3对象的版本ID?
- 15. 通过Id获取元素
- 16. 如何通过jquery获取对象值?
- 17. SOQL通过结对象获取数据
- 18. 获取事件对象通过串
- 19. 如何通过SessionId获取Session对象?
- 20. 通过变量获取json对象值
- 21. 通过属性值获取对象
- 22. 仅通过属性值获取对象
- 23. NHibernate:通过SQL查询获取对象
- 24. 通过释放对象获取崩溃
- 25. 通过WPF中的UID获取对象
- 26. 如何通过NSString获取类对象
- 27. 通过python获取浏览器对象?
- 28. 如何通过其uid获取对象?
- 29. NSDictionary通过属性值获取对象
- 30. 通过对象属性提取对象
我很好奇:你为什么想这样做?你的目标是什么? – 2009-09-09 12:35:58
@Craig McQueen:http:// stackoverflow。com/questions/1400295/python-class-for-pickle-and-copy-persistent-object – 2009-09-10 18:06:57
我无法重新找到这个源,但我认为id()返回的是特定分发需要的东西它是。现在,重新生成的CPython现在可能会返回一个类似于内存的地址,但其他发行版可能会返回不同的对象类型或不是内存指针的整数。如果有一个内置函数通过id()返回的内容来获取对象,那将会很好。尽管其他持久性用例很难想象。同样,尽管*变量,像C似乎是有道理的;我喜欢Python,因为它像大多数其他语言一样缺乏标点欺骗。 – DevPlayer 2015-06-24 02:34:36