访问对象内存地址

226 投票
12 回答
265233 浏览
提问于 2025-04-11 09:18

当你在Python中调用 object.__repr__() 方法时,你会得到类似下面的内容:

<__main__.Test object at 0x2aba1c0cf890> 

如果你重写了 __repr__() 方法,还有没有其他方法可以获取内存地址,而不是调用 super(Class, obj).__repr__() 然后用正则表达式把它提取出来呢?

12 个回答

64

只需使用

id(object)
87

你可以这样重新实现默认的表示方式:

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

Python手册id()的解释是:

返回一个对象的“身份”。这个身份是一个整数(或长整数),它在对象的整个生命周期内都是唯一且不变的。两个生命周期不重叠的对象可能会有相同的id()值。(实现说明:这实际上是对象的地址。)

所以在CPython中,这个值就是对象的地址。不过,其他Python解释器并没有这样的保证。

需要注意的是,如果你在写C扩展,你可以完全访问Python解释器的内部,包括直接访问对象的地址。

撰写回答