📜  Python函数为什么以及如何是可散列的?

📅  最后修改于: 2022-05-13 01:54:44.652000             🧑  作者: Mango

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 

因此,任何用户定义的函数都是可散列的,因为它的散列值在其生命周期内保持不变。