Python函数为何以及如何可哈希化?

如果对象的哈希值在其生存期内保持不变,则该对象被认为是可哈希的。它具有__hash __()方法,可以与其他对象进行比较。为此,它需要__eq __()或__cmp __()方法。如果可比较的对象在比较时相等,则它们具有相同的哈希值。

由于这些数据结构在内部使用哈希值,因此可哈希化可将对象用作字典键和set成员。

python中所有不可变的内置对象都是可哈希的。诸如列表和字典之类的可变容器不可哈希,而不可变容器元组则可哈希

作为用户定义类实例的对象默认情况下可哈希化;它们都比较不相等(除了它们本身),并且它们的哈希值是从得出的id()

哈希显然不一定是该函数的ID:考虑给定的lambda函数。

示例

m = lambda x: 1
print hash(m)
print id(m)
print m.__hash__()

输出结果

1265925722
3074942372
1265925722

这表明lambda函数是可哈希的

示例

现在让我们考虑给定的函数f()如下

def f():pass
print type(f)
print f.__hash__()
print hash(f)

输出结果

<type 'function'>
1265925978
1265925978

这表明任何函数都是可哈希的,因为它的哈希值在其生命周期内保持不变。