【问题标题】:how to retrive the object by using it's id in python [duplicate]如何在python中使用它的id来检索对象[重复]
【发布时间】:2012-12-08 09:58:05
【问题描述】:

可能重复:
Python: Get object by id

我有一个疑问,那就是, 如果我们尝试这个,在 python 中

>>>a=5

>>>id(a)
>>>746363

也就是说我们获取的是id,它相当于address, 我的问题是,有什么办法可以 从 id 中获取值或对象,就像我们从对象中获取 id 一样

如下,

 >>>object(746363)

 >>>5

我写了上面的那个是为了清楚地表达我的查询

【问题讨论】:

  • 你真的,真的确定你需要这个吗?你到底想做什么?
  • 是的,我需要在我的项目中。这是在我考虑共享内存时出现的
  • 你不需要这个,python 已经有办法使用共享内存。再次阅读有关多处理的文档。
  • @usernaveen 这就是我的意思,你尝试解决多处理模块中已经解决的问题;您的方法也永远无法在现代操作系统中工作:id 返回的“内存地址”当然是进程虚拟地址空间中的地址,与 ram 中的实际物理地址无关(顺便说一句,由于分页等原因可能会发生变化,而没有过程注意到)。即使您拥有实际的物理地址并将页面锁定在内存中以使其不会交换,您也无法从用户空间代码访问它,只有内核可以。
  • 是的,我知道内置模块,但我正在使用twisted,因为我知道内置多处理模块是不够的,所以我正在寻找一些东西。跨度>

标签: python memory


【解决方案1】:

首先,返回内存地址的 id() 是 CPython 的实现细节,Python 不保证它会继续以这种方式工作。所以你应该重新考虑它并寻求更多的pythonic方法。

Python 没有公开任何“好的”API 来执行此操作,但您可以使用 ctypes 模块访问任何内存点。 来自this page的示例:

import ctypes

class PyTypeObject(ctypes.Structure):
    _fields_ = ("ob_refcnt", ctypes.c_int), ("ob_type", ctypes.c_void_p), \
               ("ob_size", ctypes.c_int), ("tp_name", ctypes.c_char_p)

class PyObject(ctypes.Structure):
    _fields_ = ("ob_refcnt", ctypes.c_int), ("ob_type", ctypes.POINTER(PyTypeObject))

PyObjectPtr = ctypes.POINTER(PyObject)

print ctypes.cast(id("test"), PyObjectPtr).contents.ob_type.contents.tp_name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2016-04-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多