hashable object in Python

2021年2月18日 / 30次阅读 / Last Modified 2021年2月18日
内置函数

看项目代码,发现代码直接用object来作为dict的key,有点疑问,一查才发现原来这叫做hashable object。

一个对象能被称为 hashable , 它必须有个 hash 值,这个值在整个生命周期都不会变化,而且必须可以进行比较,所以一个对象hashable,它必须实现__hash__() 与 __eq__() 方法。

Python 的某些链接库在内部需要使用hash值,例如往集合中添加对象时会用__hash__() 方法来获取hash值,看它是否与集合中现有对象的hash值相同,如果相同则会舍去不加入,如果不同,则使用__eq__() 方法比较是否相等,以确定是否需要加入其中。

对于 Python 的内建类型来说,只要是创建之后无法修改的(immutable)类型都是 hashable ,可变动的都是 unhashable的。用户自己创建的class实例,都是hashable。(据说hash值来自id()函数,但看下面的测试代码,貌似又不是)

比如:列表、字典、集合,他们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。

Python有个builtin的函数hash():

Return the hash value of the object (if it has one). Hash values are integers. They are used to quickly compare dictionary keys during a dictionary lookup. Numeric values that compare equal have the same hash value (even if they are of different types, as is the case for 1 and 1.0).

看这段介绍,1和1.0的hash值是一样的,这个细节要注意:

>>> hash(1) == hash(1.0)
True
>>> hash(2) == hash(2.0)
True
>>>
>>> a = set()
>>> a.add(1)
>>> a.add(1.0)
>>> a
{1}

1和1.0的hash值一样,因此无法都加入一个set中。

-- EOF --

本文链接:https://www.pynote.net/archives/3535

留言区

您的电子邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top