3

在 CPython 中,内置函数id(x)返回x.
有可能扭转这种局面吗?

类似的东西object_by_memoryadress(id(x)) == x

更新:我需要这个的原因是,因为我使用的是嵌入式 Python 程序。在这个程序中,我可以创建可以相互通信的所谓“节点”,但只能使用整数、字符串和其他东西,但我需要在它们之间“传输”一个列表(这不是通常的方式)。

4

3 回答 3

2

如果您的目标是在同时运行的不同 Python 进程之间发送信息,请查看multiprocessing或 celery。

如果您只是希望能够保存/恢复/传递任意 Python 对象,请查看picklemarshal

不要这样做,这是错误的和坏的!

>>> x = 'asdd3r3'
>>> b = id(x)
>>> for key, value in globals().iteritems():
...     if id(value) == b:
...         break
...
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>> for key, value in globals().iteritems():
...     if id(value) == b:
...         break
...
>>> print value
asdd3r3
>>>

您也必须重复此locals()操作。正如您在上面看到的,如果您在迭代作用域的命名空间时在作用域中创建一个新名称,则它不起作用。它可能也以其他十几种方式被破坏。

不要这样做,这是错误的和坏的!

于 2011-08-19T09:18:40.090 回答
1

我从来没有遇到过可以做到这一点的功能。但是您可以保留您创建和存储的每个对象的内部索引以及它的内存地址。然后在表中进行查找。

于 2011-08-19T09:03:14.873 回答
0

我创建了一个包含以下代码的共享库:

#include "Python.h"
extern "C" __declspec(dllexport) PyObject* PyObjectFromAdress(long addr) {
    return (PyObject*) addr;
}

编译它并使用 ctypes 包装它:

import ctypes
dll = ctyes.cdll.thedll
object_from_id = dll.PyObjectFromAdress
object_from_id.restype = ctypes.py_object()

现在您可以在一个 python 进程中通过它们的内存地址交换 python 对象。

l1 = []
l2 = object_from_id( id(l1) )
print l1 == l2
l1.append(9)
print l2

但要注意已经被垃圾收集的对象!以下代码将使 Python 解释器崩溃。

l2 = object_from_id( id([]) )
l2.append(8)
于 2011-11-09T22:11:36.837 回答