如何打印Python中对象的内存内容?

4 投票
2 回答
3973 浏览
提问于 2025-04-17 22:25

在C/C++中,我们可以像下面这样打印一个变量的内存内容:

double d = 234.5;
unsigned char *p = (unsigned char *)&d;
size_t i;
for (i=0; i < sizeof d; ++i)
    printf("%02x\n", p[i]);

是的,我知道我们可以用pickle.dump()来把一个对象序列化,但看起来生成了很多多余的东西……我们怎么能在Python中以更简单的方式做到这一点呢?

2 个回答

1

你不能仅仅用纯Python来做到这一点。不过,你可以用C语言写一个Python扩展模块,来实现你想要的功能。不过,这样做可能用处不大。你可以在这里了解更多关于扩展模块的内容。

我假设你说的Python是指C-Python,而不是PyPy、Jython或IronPython。

3

在Python中,对象的内部存储方式是无法通过Python代码直接访问的,如果想要了解这些内容,你需要写一个C语言的扩展。

如果你正在设计自己的数据序列化协议,也就是把数据转换成可以存储或传输的格式,那么你可以看看struct模块。这个模块可以帮助你把Python中的值转换成二进制数据,或者把二进制数据转换回你指定的格式。例如:

import struct
print(list(struct.pack('d', 3.14)))

这段代码会显示[31, 133, 235, 81, 184, 30, 9, 64],因为这些数字是3.14这个数在双精度格式下的字节值。

注意:在Python 3.x中,struct.pack会返回一个bytes对象,而在Python 2.x中则返回一个str对象。如果你想在Python 2.x中查看字节的数字编码,你需要使用print map(ord, struct.pack(...))来实现。

撰写回答