132

如何在 Python 2.7 中打印变量的内存地址?我知道 id() 返回变量或对象的“id”,但这不会返回我期望看到的内存地址的预期 0x3357e182 样式。我想做类似的事情print &x,例如 x 是一个 C++ int 变量。我怎样才能在 Python 中做到这一点?

4

3 回答 3

237

id是您要使用的方法:将其转换为十六进制:

hex(id(variable_here))

例如:

x = 4
print hex(id(x))

给我:

0x9cf10c

哪个是你想要的,对吧?

(有趣的是,将两个变量绑定到相同的变量int可能会导致使用相同的内存地址。)
尝试:

x = 4
y = 4
w = 9999
v = 9999
a = 12345678
b = 12345678
print hex(id(x))
print hex(id(y))
print hex(id(w))
print hex(id(v))
print hex(id(a))
print hex(id(b))

这给了我相同的对,即使是大整数。

于 2013-05-06T22:48:24.103 回答
17

根据手册,在 CPythonid()中是变量的实际内存地址。如果您想要十六进制格式,请调用hex()它。

x = 5
print hex(id(x))

这将打印 x 的内存地址。

于 2013-05-06T22:51:20.473 回答
15

在 Python 2.7 中一般无法获取值的内存地址。在 Jython 或 PyPy 中,实现甚至不知道你的值的地址(甚至不能保证它会留在同一个地方——例如,垃圾收集器可以根据需要移动它)。

但是,如果您只关心 CPython,id则已经返回了地址。如果唯一的问题是如何以某种方式格式化该整数......它与格式化任何整数相同:

>>> hex(33)
0x21
>>> '{:#010x}'.format(33) # 32-bit
0x00000021
>>> '{:#018x}'.format(33) # 64-bit
0x0000000000000021

… 等等。

然而,这几乎没有充分的理由。如果你确实需要一个对象的地址,想必是传给ctypes或类似的,这种情况下你应该使用ctypes.addressof或类似的。

于 2013-05-06T23:03:02.690 回答