我有一个用例,要求我创建一组可变类型 对象,像这样:
class abc(object):
def __init__(self):
self.a = set(["a"])
def __eq__(self, o):
return self.a == o.a
a = abc()
b = abc()
print hash(a)
print hash(b)
print a == b
set([a]) == set([b])
阅读python文档,它说
“比较相等的对象具有相同的哈希值”
和
“如果一个类定义了可变对象并实现了
__cmp__()
或__eq__()
方法,那么它不应该实现__hash__()
,因为hashable collection实现要求对象的哈希值是不可变的”< / p>
上面的示例将为a和b两者的相等和不同整数哈希打印true,但对于set相等则为false。文档建议将对象设置为不可用,但是我无法将其插入集合中。我的用法不正确吗?
python中的集合是不是要用于可变类型?
答案 0 :(得分:2)
如果您将一个对象插入一个集合(或任何语言的任何基于散列的数据结构)然后对其进行变异,那么事情就会中断,因为新的散列值可能不再对应于它在数组中的位置。因此,例如,如果在变异之后插入了与前一个对象相同的另一个对象,python可能无法找到前一个对象,并且它将使两者都存在于集合中。这同样适用于二叉搜索树。
您需要: