当你在Python中调用object.__repr__()方法时,你会得到类似这样的结果:

< __main__。测试对象位于0x2aba1c0cf890>

如果你重载__repr__(),除了调用super(Class, obj).__repr__()和reexing它,有没有任何方法来获得内存地址?


当前回答

虽然在默认的CPython实现中,id(object)确实可以获取对象的地址,但这通常是无用的…你不能对纯Python代码中的地址做任何事情。

只有在C扩展库中才能使用该地址……在这种情况下,获取对象的地址是很简单的,因为Python对象总是作为C指针传递。

其他回答

使用ctypes,您可以使用

>>> import ctypes
>>> a = (1,2,3)
>>> ctypes.addressof(a)
3077760748L

文档:

addressof(C实例)->整数 返回C实例内部缓冲区的地址

注意,在CPython中,当前id(a) == ctypes.addressof(a),但是ctypes.addressof(a)。addressof应该返回每个Python实现的真实地址,如果

支持Ctypes 内存指针是一个有效的概念。

编辑:增加关于ctypes的解释器独立性的信息

只使用

id(object)

虽然在默认的CPython实现中,id(object)确实可以获取对象的地址,但这通常是无用的…你不能对纯Python代码中的地址做任何事情。

只有在C扩展库中才能使用该地址……在这种情况下,获取对象的地址是很简单的,因为Python对象总是作为C指针传递。

你可以这样重新实现默认的repr:

def __repr__(self):
    return '<%s.%s object at %s>' % (
        self.__class__.__module__,
        self.__class__.__name__,
        hex(id(self))
    )

我知道这是一个老问题,但如果你现在还在用python 3编程……我实际上发现,如果它是一个字符串,那么有一个非常简单的方法来做到这一点:

>>> spam.upper
<built-in method upper of str object at 0x1042e4830>
>>> spam.upper()
'YO I NEED HELP!'
>>> id(spam)
4365109296

字符串转换也不影响内存中的位置:

>>> spam = {437 : 'passphrase'}
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'
>>> str(spam)
"{437: 'passphrase'}"
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'