Python函数为什么以及如何是可散列的?
所以从这个问题开始,即Python函数为什么以及如何是可散列的?首先,应该知道Python中的 hashable 是什么意思。因此,hashable 是Python对象的一个特性,它告诉对象是否具有哈希值。如果对象具有哈希值,则它可以用作字典的键或集合中的元素。
如果一个对象的哈希值在其整个生命周期内都不会改变,那么它就是可哈希的。 Python有一个内置的哈希方法( __hash__() ),可以与其他对象进行比较。为了比较它需要 __eq__() 或 __cmp__() 方法,如果可散列对象相等,则它们具有相同的散列值。 Python中所有不可变的内置对象都像元组一样可散列,而列表和字典等可变容器则不可散列。
作为用户定义类的实例的对象默认是可散列的,它们都比较不相等,它们的散列值是它们的 id()。
示例:考虑两个具有相同值的元组 t1、t2,并查看差异:
Python3
t1 = (1, 5, 6)
t2 = (1, 5, 6)
# show the id of object
print(id(t1))
print(id(t2))
Python3
# create a one-line function
l = lambda x : 1
# show the hash value
print(hash(l))
# show the id value
print(id(l))
# show the hash value
print (l.__hash__())
Python3
# create an empty function
def fun():
pass
# print types of function
print(type(fun))
# print hash value
print(fun.__hash__())
# print hash value
print(hash(fun))
输出:
140040984150664
140040984150880
在上面的示例中,两个对象是不同的,因为对于不可变类型,哈希值取决于存储的数据而不是它们的 id。
示例:让我们看看 lambda 函数是否可散列。
Python3
# create a one-line function
l = lambda x : 1
# show the hash value
print(hash(l))
# show the id value
print(id(l))
# show the hash value
print (l.__hash__())
输出:
-9223363246992694337
140637793303544
-9223363246992694337
因此,lambda 函数是可散列的。
示例:让我们看看用户定义的基于 def 的函数是否可散列。
Python3
# create an empty function
def fun():
pass
# print types of function
print(type(fun))
# print hash value
print(fun.__hash__())
# print hash value
print(hash(fun))
输出:
-9223363242199589441
-9223363242199589441
因此,任何用户定义的函数都是可散列的,因为它的散列值在其生命周期内保持不变。