在Python中使用对象ID作为对象的哈希值

11 投票
2 回答
2479 浏览
提问于 2025-04-15 17:53

把对象的 id 当作哈希键(通过 __hash__)来给一个本来可以改变的对象进行哈希处理,这样做是否明智?如果用对象的属性来做哈希键会更好,但这些属性都是可变的,可能会改变。

我在看 实例集合 的时候想到这个问题,想知道这样做是否合适。

2 个回答

7

对于大多数Python类来说,这是默认的行为。那些不可哈希的类之所以不可哈希,是有原因的:它们是可变的集合。

对于集合来说,比较它们是否相等(通过__eq__()定义)是基于它们内容的相等性。这一点,以及__hash__()需要和相等性保持一致,都会导致__hash__()变得可变,这对于包含这些对象的集合来说是非常糟糕的。

所以你可以这样做,但这会让你失去基于内容的相等性比较。

14

是的,只要你同时定义了 __eq__(还有可能需要定义 __ne__!),这样做是可以的。换句话说,只要你能接受 a==ba is b 的意思完全一样,那就没问题!

撰写回答