Python:集合是如何工作的

25 投票
2 回答
13980 浏览
提问于 2025-04-15 20:57

我有一组对象,想把它们变成一个集合。我的这些对象里有几个字段,其中包括 o.ido.area。我希望如果这两个字段相同,那么这两个对象就算是相等的。也就是说,只有当 o1.area==o2.areao1.id==o2.id 时,o1==o2 才成立。

我尝试重写了 __eq____cmp__ 这两个方法,但出现了错误:TypeError: unhashable instance

我应该重写什么呢?

2 个回答

9

“TypeError: unhashable instance.” 这个错误通常是因为你使用了旧式的类定义,也就是:

class A:
  pass

建议你使用新式的类定义:

class A(object):
  pass

如果你重写了 __cmp__ 这个函数,那么你应该同时重写 __hash__ 函数,这样才能让你的对象在集合(sets)中使用。否则,哈希函数会认为所有对象实例都是不相等的,这样 __cmp__ 函数就不会被调用了。

38

定义一个 __hash__ 方法,让它根据 id 和 area 字段返回一个有意义的哈希值。比如:

def __hash__(self):
    return hash(self.id) ^ hash(self.area)

撰写回答