使用对象id作为Python中对象的哈希

Nou*_*him 10 python hash

将对象id用作散列键(通过.__hash__)以便能够为程序的单个实例散列其他可变对象是明智的吗?使用对象属性会更好,但它们都是可变的并且可以改变.

在查看实例集时,我想到了这一点,我想知道它是否明智.

Ale*_*lli 14

是的,只要你也一致地定义__eq__(并且可能是__ne__! - ).IOW,没关系,只要你的a==b意思与完全一样好a is b! - )


Raf*_*ird 6

对于大多数Python类,这是默认行为.不可动摇的是不可取的,原因很简单:它们是可变的集合.

对于集合,__eq__()基于其内容的相等性具有相等关系(由其定义)是切实可行的.这个,以及要求__hash__()平等的要求,当然会使__hash__()可变,这对包含这些对象的集合来说是可怕的.

所以你可以这样做,但它会花费你基于内容的平等关系.