2021年2月18日 / 98次阅读 / 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
©Copyright 麦新杰 Since 2019 Python笔记