【发布时间】:2010-01-11 05:36:30
【问题描述】:
使用对象id 作为散列键(通过__hash__)以便能够为单个程序实例散列其他可变对象是否明智?使用对象属性会更好,但它们都是可变的并且可以更改。
我在查看 Sets of instances 时想到了这件事,我想知道这是否明智。
【问题讨论】:
使用对象id 作为散列键(通过__hash__)以便能够为单个程序实例散列其他可变对象是否明智?使用对象属性会更好,但它们都是可变的并且可以更改。
我在查看 Sets of instances 时想到了这件事,我想知道这是否明智。
【问题讨论】:
是的,只要您还与此一致地定义 __eq__(并且可能是 __ne__!-)。 IOW,没关系,只要您对a==b 的含义与a is b 完全相同!-)
【讨论】:
对于大多数 Python 类,这是默认行为。不可散列的不可散列是有充分理由的:它们是可变集合。
对于集合而言,基于其内容的相等性具有相等关系(由__eq__() 定义)是可行的。这一点,以及 __hash__() 与相等性一致的要求,当然会使 __hash__() 可变,这对于包含此类对象的集合来说是可怕的。
所以你可以这样做,但它会花费你基于内容的相等关系。
【讨论】: