散列自定义对象

时间:2018-03-29 10:23:35

标签: python hash

python中的

hash()方法可以将所有不可变对象与唯一哈希值匹配。但是,我无法理解用户定义类的对象的hash()方法的行为。一些资源表示如果用户定义的类不包含__hash__()__eq__()方法,则无法对该对象进行哈希处理。另一方面,其他人声称相反。

换句话说,__eq__()__hash__()方法在散列自定义对象时的作用是什么?

2 个答案:

答案 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”以确认是否相等。