hash()方法可以将所有不可变对象与唯一哈希值匹配。但是,我无法理解用户定义类的对象的hash()方法的行为。一些资源表示如果用户定义的类不包含__hash__()
和__eq__()
方法,则无法对该对象进行哈希处理。另一方面,其他人声称相反。
换句话说,__eq__()
和__hash__()
方法在散列自定义对象时的作用是什么?
答案 0 :(得分:0)
如果您未实施__hash__
,hash()
将使用默认实施。如果您没有实现__eq__
,则在比较两个实例时将使用默认实现。
class C:
pass
class D:
def __hash__(self):
return 1
def __eq__(self, other):
return True
print(hash(C())) # changing for every C instance
print(C() == C()) # False since objects are different
print(hash(D())) # always 1
print(D() == D()) # always True
答案 1 :(得分:0)
基本上,'hash'应该很快,并作为一个“分类”计算来知道两个对象是否相等。
'eq'应该恰好是告诉对象是否绝对的函数 是否平等。也许这个函数必须执行大量的检查(例如,如果你想通过所有成员字段的相等来定义对象的相等性,并且可能有很多它们)
这两个函数的目的是快速说“不,它们不相等”(哈希函数),因为比较经常被大量使用,并且通常两个对象不应该是“等于”。
不执行大量“eq”函数,而是执行大量快速“散列”函数,如果两个散列都匹配,则执行“eq”以确认是否相等。