对象的唯一标识符(从十六进制转换为十进制)

3 投票
1 回答
1809 浏览
提问于 2025-04-20 11:38

我正在学习Python(现在在上类)。在这个网站上(页面底部),第一个练习(在13.7. Exercises下)说:

创建并打印一个Point对象,然后使用id来打印这个对象的唯一标识符。把十六进制形式转换成十进制,并确认它们是否匹配。

我需要帮助,因为我不太确定我该怎么做。

如果我这样做:

class Point:
    pass

print Point()
print id(Point)

我得到这个输出:

<__main__.Point instance at 0xb71c496c>
3072094252

那么,我应该这样做这个练习的第一部分吗?接下来该怎么办?我猜第二行是十进制数字(我说得对吗?)。那么第一行呢?怎么把它转换成十进制?

1 个回答

6

把第二个数字转换成十六进制,使用hex()函数,然后检查它是否在第一个数字里:

p = Point()
hexadecimal_id = hex(id(p))
present = hexadecimal_id in repr(p)

注意,我首先保存了一个引用Point()这个实例;否则你会得到一个新的实例,可能会有一个新的id()值。

另外,不要把类和实例搞混;类本身也是一个对象,所以它也有自己的id()值。

如果你想反过来做,就得把十六进制字符串解析出来;如果你假设它是最后一个空格后面的部分,可以这样做:

hexadecimal_id = repr(p).rpartition(' ')[-1][:-1]
present = int(hexadecimal_id, 16) == id(p)

这里,str.rpartition()方法会在最后一个空格处分割字符串,我们用[-1](最后一个元素)来获取它后面的部分,然后把结果缩短一个字符,以去掉最后的>字符。

一旦你得到了十六进制数字,就可以用int()函数把它当作整数来解释,记得指定进制为16。

示例:

>>> class Point:
...     pass
... 
>>> p = Point()
>>> id(p)
4300021632
>>> hex(id(p))
'0x1004d1f80'
>>> p
<__main__.Point instance at 0x1004d1f80>
>>> hex(id(p)) in repr(p)
True
>>> # the other direction
... 
>>> repr(p).rpartition(' ')[-1][:-1]
'0x1004d1f80'
>>> hexadecimal_id = repr(p).rpartition(' ')[-1][:-1]
>>> int(hexadecimal_id, 16)
4300021632
>>> int(hexadecimal_id, 16) == id(p)
True

撰写回答