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

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

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


当前回答

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

你可以通过以下方法得到适合这个目的的东西:

id(self)

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

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

使用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的解释器独立性的信息

Python手册对id()是这样说的:

返回一个对象的“标识”。 这是一个整数(或长整数) 哪个保证是唯一的 常量 一生。两个对象 不重叠的生命周期可能有 相同的id()值。(注:实现 这是对象的地址。)

在CPython中,这是对象的地址。不过,其他任何Python解释器都没有这样的保证。

请注意,如果您正在编写一个C扩展,您可以完全访问Python解释器的内部结构,包括直接访问对象的地址。