+15 投票
分类:Python编程与实践 | 用户: (3.1k 分)

2 个回答

0 投票
用户: (3.0k 分)
采纳于 用户:
 
已采纳
一个对象的哈希值如果在其生命周期内绝不改变,就被称为:可哈希。

可哈希性使得对象能够作为字典键或集合元素使用,因为这些数据结构使用散列表,需要在内部使用哈希值。

大多数 Python 中的不可变内置对象都是可哈希的;可变容器(例如列表或字典)则不可哈希;不可变容器(例如元组和 frozenset)仅当它们的元素均为可哈希时才是可哈希的。

用户定义类的实例对象默认是可哈希的。 它们在比较时一定不相同(除非是与自己比较),它们的哈希值的生成是基于它们的 id()。
+5 投票
用户: (8.0k 分)

这个问题指向python中对象的可哈希性,其中在python的官方文档中,对hashable的解释如下

An object is hashable if it has a hash value which never changes during its lifetime (it needs a hash() method), and can be compared to other objects (it needs an eq() method). Hashable objects which compare equal must have the same hash value.

如果一个对象在其生命周期内其值不变,并且可以进行比较,就视作hashable的对象。

在今天的一个问题中,我简单的介绍了hash和hash碰撞的概念Python中hash出的值具体是怎么计算出来的 - 爱可可Q&A (aicoco.net)

那么为什么必须要值不变才能进行hash呢,这里我给出一个浅薄的解释如下:

Python的中变量通过引用的方式指向内存地址,在其生命周期内,其指向的内存地址一般是不变的。

对于不可变对象(可以理解为常量),一个值对应一个内存id,不同的值意味着不同的内存,相同的值存储在相同的内存,这里就可以将不可变对象理解成哈希表中的key,将内存理解为经过哈希运算的哈希值value。

对于可变对象,由于其在生命周期内值经常发生变化,但是内存id基本不变,因此会出现多个值指向同一个内存地址,出现了hash碰撞,不满足hash特性,因此是unhashable。

当然,以上为了简单的理解,没有介绍python的内存机制以及其他特性,但是应该可以帮助题主理解hashable这个概念。

欢迎来到 爱可可Q&A ,有什么问题可以尽管在这里提问,你将会收到其他成员的热心回答。
...