Python中的“可哈希”是什么意思?
在Python代码中,说一个对象是可哈希的,到底是什么意思呢?
10 个回答
任何不可变的东西(不可变的意思是,不容易改变)都可以进行哈希处理。除了要找哈希函数之外,如果一个类有这个功能,可以通过比如说 dir(tuple)
来查看,看看里面有没有 __hash__
这个方法。下面是一些例子:
#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable
不可变类型的列表:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
可变类型的列表:
list, dict, set, bytearray, user-defined classes
这里的所有回答都很好地解释了Python中可哈希对象的概念,但我觉得首先需要理解“哈希”这个词。
哈希是计算机科学中的一个概念,用来创建高效的、伪随机访问的数据结构,这种结构可以快速存储和访问大量数据。
举个例子,如果你有10,000个电话号码,想把它们存储在一个数组里(数组是一种顺序的数据结构,它把数据存放在连续的内存位置,并且可以随机访问),但你可能没有足够的连续内存空间。
所以,你可以使用一个大小为100的数组,并用一个哈希函数把一组值映射到相同的索引上,这些值可以存放在一个链表里。这样做的性能和数组差不多。
哈希函数可以很简单,比如用数字除以数组的大小,然后取余数作为索引。
想了解更多细节,可以参考这个链接:https://en.wikipedia.org/wiki/Hash_function
这里还有一个不错的参考资料:http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
来自Python 词汇表的内容:
一个对象是“可哈希”的,意思是它有一个在整个生命周期内都不会改变的哈希值(这需要一个
__hash__()
方法),并且可以和其他对象进行比较(这需要一个__eq__()
或__cmp__()
方法)。如果两个可哈希的对象比较后是相等的,它们的哈希值也必须相同。可哈希性使得一个对象可以用作字典的键和集合的成员,因为这些数据结构在内部使用哈希值。
Python 中所有不可变的内置对象都是可哈希的,而可变的容器(比如列表或字典)则不是。用户自定义类的实例默认是可哈希的;它们之间比较后都是不相等的,哈希值就是它们的
id()
。