【问题标题】:print memory address of Python variable [duplicate]打印Python变量的内存地址[重复]
【发布时间】:2013-04-30 18:46:55
【问题描述】:

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

【问题讨论】:

  • 请注意,id 在 PyPy 或 Jython 中根本不是指针(不确定 IronPython);这是 CPython 特有的东西。更重要的是……你为什么要这个地址?任何实际的用例都可能涉及ctypes,在这种情况下,您希望使用ctypes 以可以传递给C 代码的格式获取地址,而不是id

标签: python memory-address


【解决方案1】:

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))

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

【讨论】:

  • 我认为这是 CPython 特有的。还有来自ctypeaddressof
  • 我相信这只适用于小的ints。
  • 让我们找出@Daenyth!
  • @BlackVegetable:如果不是 CPython,你所说的“香草”是什么意思?
  • 之所以会这样,是因为 x 和 y 都指向同一个内存地址。在这种情况下,如果没有明确要求,Python 有什么理由在内存中创建完全相同的对象两次?
【解决方案2】:

根据the manual,在CPython中id()是变量的实际内存地址。如果您想要十六进制格式,请致电hex()

x = 5
print hex(id(x))

这将打印 x 的内存地址。

【讨论】:

    【解决方案3】:

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

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

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

    ……等等。

    但是,这几乎没有充分的理由。如果你真的需要一个对象的地址,大概是传递给ctypes或者类似的,这种情况下你应该使用ctypes.addressof或者类似的。

    【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多