在Python中使用对象ID作为对象的哈希值
把对象的 id
当作哈希键(通过 __hash__
)来给一个本来可以改变的对象进行哈希处理,这样做是否明智?如果用对象的属性来做哈希键会更好,但这些属性都是可变的,可能会改变。
我在看 实例集合 的时候想到这个问题,想知道这样做是否合适。
2 个回答
7
对于大多数Python类来说,这是默认的行为。那些不可哈希的类之所以不可哈希,是有原因的:它们是可变的集合。
对于集合来说,比较它们是否相等(通过__eq__()
定义)是基于它们内容的相等性。这一点,以及__hash__()
需要和相等性保持一致,都会导致__hash__()
变得可变,这对于包含这些对象的集合来说是非常糟糕的。
所以你可以这样做,但这会让你失去基于内容的相等性比较。
14
是的,只要你同时定义了 __eq__
(还有可能需要定义 __ne__
!),这样做是可以的。换句话说,只要你能接受 a==b
和 a is b
的意思完全一样,那就没问题!