首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中"hashable“是什么意思?

在Python中"hashable“是什么意思?
EN

Stack Overflow用户
提问于 2013-01-26 17:48:07
回答 6查看 187.4K关注 0票数 272

我试着在互联网上搜索,但找不到hashable的意思。

当他们说对象是hashablehashable objects是什么意思?

EN

回答 6

Stack Overflow用户

发布于 2016-05-25 14:45:26

根据我的理解,根据Python术语表,当您创建hashable对象的实例时,也会根据实例的成员或值来计算不可变值。例如,该值可以用作字典中的键,如下所示:

代码语言:javascript
运行
复制
>>> tuple_a = (1, 2, 3)
>>> tuple_a.__hash__()
2528502973977326415
>>> tuple_b = (2, 3, 4)
>>> tuple_b.__hash__()
3789705017596477050
>>> tuple_c = (1, 2, 3)
>>> tuple_c.__hash__()
2528502973977326415
>>> id(a) == id(c)  # a and c same object?
False
>>> a.__hash__() == c.__hash__()  # a and c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'

我们可以发现tuple_atuple_c的散列值是相同的,因为它们具有相同的成员。当我们在dict_a中使用tuple_a作为键时,我们可以发现dict_a[tuple_c]的值是相同的,这意味着,当它们用作字典中的键时,它们返回相同的值,因为散列值是相同的。对于那些不可哈希的对象,__hash__方法被定义为None

代码语言:javascript
运行
复制
>>> type(dict.__hash__) 
<class 'NoneType'>

我猜这个哈希值是在实例初始化时计算的,而不是以动态的方式计算的,这就是为什么只有不可变的对象是可哈希的。希望这能有所帮助。

票数 21
EN

Stack Overflow用户

发布于 2020-05-19 20:07:41

Hashable =能够被散列。

好的,什么是哈希?散列函数是一个函数,它接受一个对象,比如“Python”之类的字符串,然后返回一个固定大小的代码。为简单起见,假定返回值为整数。

当我在Python3中运行hash(‘Python’)时,我得到的结果是5952713340227947791。不同版本的Python可以自由更改底层散列函数,因此您可能会得到不同的值。重要的是,无论我现在运行多少次hash(‘Python’),我总是会在相同版本的Python上得到相同的结果。

但是hash(‘Java’)返回1753925553814008565。因此,如果我散列的对象发生了变化,结果也会发生变化。另一方面,如果我散列的对象没有改变,那么结果保持不变。

为什么这很重要?

例如,Python字典要求键是不可变的。也就是说,关键点必须是不变的对象。字符串在Python中是不可变的,其他基本类型(int、float、bool)也是如此。元组和冻结集也是不可变的。另一方面,列表并不是不可变的(也就是说,它们是可变的),因为您可以更改它们。同样,字典也是可变的。

因此,当我们说某些东西是hashable时,我们的意思是它是不可变的。如果我试图将可变类型传递给hash()函数,它将失败:

代码语言:javascript
运行
复制
>>> hash('Python')
1687380313081734297
>>> hash('Java')
1753925553814008565
>>>
>>> hash([1, 2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash({1, 2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> hash({1 : 2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
>>> hash(frozenset({1, 2}))
-1834016341293975159
>>> hash((1, 2))
3713081631934410656
票数 12
EN

Stack Overflow用户

发布于 2020-05-29 08:13:45

在Python中,任何不可变对象(如整数、布尔值、字符串、元组)都是hashable,这意味着它的值在其生命周期内不会改变。这允许Python创建唯一的散列值来标识它,字典可以使用该散列值来跟踪唯一的键和集,以跟踪唯一的值。

这就是为什么Python要求我们对字典中的键使用不可变的数据类型。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14535730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档