如何打印Python中对象的内存内容?
在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(...))
来实现。