我试着在互联网上搜索,但找不到hashable的意思。
当他们说对象是hashable
或hashable objects
是什么意思?
发布于 2016-05-25 14:45:26
根据我的理解,根据Python术语表,当您创建hashable对象的实例时,也会根据实例的成员或值来计算不可变值。例如,该值可以用作字典中的键,如下所示:
>>> 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_a
和tuple_c
的散列值是相同的,因为它们具有相同的成员。当我们在dict_a
中使用tuple_a
作为键时,我们可以发现dict_a[tuple_c]
的值是相同的,这意味着,当它们用作字典中的键时,它们返回相同的值,因为散列值是相同的。对于那些不可哈希的对象,__hash__
方法被定义为None
>>> type(dict.__hash__)
<class 'NoneType'>
我猜这个哈希值是在实例初始化时计算的,而不是以动态的方式计算的,这就是为什么只有不可变的对象是可哈希的。希望这能有所帮助。
发布于 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()函数,它将失败:
>>> 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
发布于 2020-05-29 08:13:45
在Python中,任何不可变对象(如整数、布尔值、字符串、元组)都是hashable,这意味着它的值在其生命周期内不会改变。这允许Python创建唯一的散列值来标识它,字典可以使用该散列值来跟踪唯一的键和集,以跟踪唯一的值。
这就是为什么Python要求我们对字典中的键使用不可变的数据类型。
https://stackoverflow.com/questions/14535730
复制相似问题