打印Python变量的内存地址

brn*_*792 70 python memory-address

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

Bla*_*ble 137

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

hex(id(variable_here))

例如:

x = 4
print hex(id(x))
Run Code Online (Sandbox Code Playgroud)

给我:

0x9cf10c
Run Code Online (Sandbox Code Playgroud)

这是你想要的,对吧?

(有趣的是,将两个变量绑定到同一个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))
Run Code Online (Sandbox Code Playgroud)

这给了我相同的配对,即使对于大整数也是如此.

  • 我认为这是CPython特有的.还有来自[ctype]的`addressof`(http://docs.python.org/2/library/ctypes.html#ctypes.addressof) (6认同)
  • 我相信这仅适用于小的 `int`。 (3认同)
  • 发生这种情况的原因是因为 x 和 y 都指向相同的内存地址。在这种情况下,如果没有明确要求,Python 有什么理由在内存中创建完全相同的对象两次? (2认同)

aba*_*ert 9

一般来说,无法在Python 2.7中获取值的内存地址.在Jython或PyPy中,实现甚至不知道你的值的地址(并且甚至不能保证它将保持在同一个地方 - 例如,垃圾收集器被允许在需要时移动它).

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

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

… 等等.

然而,这几乎没有充分的理由.如果你确实需要一个对象的地址,那么可能是将它传递给ctypes或类似的,在这种情况下你应该使用ctypes.addressof或类似.


Jon*_*han 7

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

x = 5
print hex(id(x))
Run Code Online (Sandbox Code Playgroud)

这将打印x的内存地址.