Python 是否可以通过内存地址访问对象?

Python 是否可以通过内存地址访问对象?,python,cpython,Python,Cpython,在CPython中,内置函数id(x)返回x的内存地址 有可能扭转这种局面吗 类似于object\u by\u memoryAddress(id(x))==x 更新:我之所以需要它,是因为我正在使用一个带有嵌入式Python的程序。在这个程序中,我可以创建所谓的“节点”,它们可以相互通信,但只能使用整数、字符串和其他东西,但我需要在它们之间“传输”一个列表(这不是通常的方式).我从来没有遇到过这样的函数。没有。但是你可以保留你创建的每个对象的内部索引,并存储它以及它的内存地址。然后在表中进行查找

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

类似于
object\u by\u memoryAddress(id(x))==x


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

我从来没有遇到过这样的函数。没有。但是你可以保留你创建的每个对象的内部索引,并存储它以及它的内存地址。然后在表中进行查找。

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

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

不要这样做,这是错误的和糟糕的!
>x='asdd3r3'
>>>b=id(x)
>>>对于键,值为globals()。iteritems():
...     如果id(值)==b:
...         打破
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
RuntimeError:字典在迭代期间更改了大小
>>>对于键,值为globals()。iteritems():
...     如果id(值)==b:
...         打破
...
>>>打印值
asdd3r3
>>>
您还必须对
locals()
重复此操作。正如您在上面看到的,如果您在作用域中创建一个新名称,同时在作用域的名称空间上进行迭代,那么它将不起作用。它也可能以其他十几种方式被破坏


不要这样做,这是错误的和糟糕的 我创建了一个共享库,其中包含以下代码:

#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)

Lol。问题是,我想使用所需函数获取的对象不在全局范围内,无论是在局部范围内还是在非局部范围内。在某种程度上,这是另一个问题,但在同一个过程中,但他们不能以共同的方式相互沟通。(我将此添加到问题中。)如果他们可以传递项的内存地址,那么他们可以传递对项的引用,或者使用
pickle
或类似工具传递项本身。由于内存地址是一个整数,我可以在他们之间传递它。从未使用过酸洗,甚至不知道它是什么。我来看看。谢谢。是的,
pickle
marshal
是序列化Python对象的方式。我将把它添加到我的答案中。是的,
pickle
几乎可以将任何Python对象转换为字符串。我仍然无法理解这何时合适。为什么不能在两个“节点”之间交换对列表的引用?这没有任何意义。XPRESSO是一种基于节点的图形“脚本语言”。Py4D,电影4D的新Python扩展也将Python集成到这个系统中。在XPresso中,数据(如整数、字符串)从输出传输到输入。当然,它不支持交换任何类型的数据,只支持整数等。你现在能想象这种需要吗?是的,这是有道理的。你最初的问题为什么没有包括这些?这显然与任何可能的解决方案有关。你是对的。知识随着时间而来,你知道吗我将在我未来的帖子中包含真实的事实。我经常试着把它简化成一个简短但相似的例子等等。
l2 = object_from_id( id([]) )
l2.append(8)