使用对象id
作为散列键(通过__hash__
)能够为程序的单个实例散列另外可变对象是明智吗?使用对象属性会更好,但它们都是可变的,并且可以改变。使用对象ID作为Python中对象的散列
这件事发生在我看着Sets of instances,我想知道这是否明智。
使用对象id
作为散列键(通过__hash__
)能够为程序的单个实例散列另外可变对象是明智吗?使用对象属性会更好,但它们都是可变的,并且可以改变。使用对象ID作为Python中对象的散列
这件事发生在我看着Sets of instances,我想知道这是否明智。
是的,只要你还定义__eq__
(和大概__ne__
! - )一致。 IOW,没关系,只要你没问题,a==b
的含义与a is b
完全一样! - )
对于大多数Python类,这是默认行为。难以置信的原因是有一个很好的理由:它们是可变的集合。
对于集合,基于它们的内容相等具有相等关系(由__eq__()
定义)是实际的。这和__hash__()
要求平等的要求,当然会使得__hash__()
可变,这对于包含这些对象的集合来说将是可怕的。
所以你可以做到这一点,但它会花费你基于内容的平等关系。
谢谢。你的第二句话很好地阐明了它。 – 2010-01-11 05:42:39