我可以从python对象的内存地址获取它吗?

我可以从python对象的内存地址获取它吗?,python,pyqt4,ipython,dereference,Python,Pyqt4,Ipython,Dereference,我正在学习如何将Qt与PyQt一起使用,我有一个带有StandardItemModel的QTabelView。我已经成功地填充了该模型,并将itemChanged信号连接到一个插槽。我想搞乱IPython中返回的任何对象,所以目前我有一行: def itemChangedSlot(epw, item): new_data = item.data() print new_data print item 哪张照片 <PyQt4.QtGui.QStandardItem

我正在学习如何将Qt与PyQt一起使用,我有一个带有StandardItemModel的QTabelView。我已经成功地填充了该模型,并将itemChanged信号连接到一个插槽。我想搞乱IPython中返回的任何对象,所以目前我有一行:

def itemChangedSlot(epw, item):
    new_data = item.data()
    print new_data
    print item
哪张照片

<PyQt4.QtGui.QStandardItem object at 0x07C5F930>
<PyQt4.QtCore.QVariant object at 0x07D331F0>


在IPython会话中,是否可以使用此内存地址获取对象?我没有在谷歌上看到任何东西,也许我没有我的术语对吧

您需要保存对对象的引用(即,将其分配给变量或将其存储在列表中)


从对象地址直接转到对象(即)没有语言支持。

你几乎肯定问错了问题,雷蒙德·赫廷格的答案几乎肯定是你真正想要的

类似这样的东西可能有助于深入研究CPython解释器的内部结构,以便于学习或审计它的安全漏洞等……但即使如此,您最好将Python解释器嵌入到程序中,并编写函数,在Python解释器中公开您想要的任何内容,或者至少编写一个C扩展模块,让您可以操作CPython对象

但是,万一你真的需要这么做

首先,甚至没有可靠的方法从
repr
获取地址。大多数具有有用的
eval
-able表示形式的对象都会提供该表示形式。例如,
('1',1)
的repr是
“('1',1)”
,而不是
。此外,即使对于没有有用表示的对象,返回
也只是许多类型遵循的未声明约定(以及用户定义类的默认约定),而不是您可以依赖的

但是,由于您可能只关心CPython,因此您可以依赖:

CPython实现细节:这是内存中对象的地址

(当然,如果您有要调用
id
(或
repr
)的对象,您不需要通过指针取消对它的引用,如果您没有该对象,它可能已被垃圾收集,因此没有任何可取消引用的内容,但可能您仍然有它,只是记不起放在哪里了……)

接下来,你怎么处理这个地址?Python没有公开任何函数来执行与
id
相反的操作。但是,有很好的文档记录,如果您的Python是围绕一个共享库构建的,那么只需加载它,就可以通过访问该C API。事实上,
ctypes
提供了一个特殊的变量,可以自动加载正确的共享库来调用cAPI,
ctypes.pythonapi

在非常旧的
ctypes
版本中,您可能需要显式地查找和加载它,如
pydll=ctypes.cdll.LoadLibrary('/usr/lib/libpython2.5.so')
(这是针对安装了Python 2.5的linux,安装到/usr/lib中;显然,如果这些细节中的任何一个不同,确切的命令行都会不同。)


当然,让Python解释器崩溃要比做任何有用的事情容易得多,但做任何有用的事情并不是不可能的,您可能会从中得到乐趣。

您正在打印的对象
new\u data
就是对象。只需返回或以其他方式存储它,而不是打印它。这不是不可能做到的,但这并不容易,而且在任何情况下都没有文件证明它可以工作,这通常是一个非常糟糕的主意。如果你正在试验CPython如何在封面下工作,或者调试垃圾收集器,或者诸如此类的东西,这可能是值得的,但是,否则,你找错了方向,雷蒙德·海廷格的答案就是你想要的。是的,试着使用。在地址后面写上