在Python中,你是什么意思?
我试图search互联网,但无法find可哈希的含义。
当他们说对象可以被hashable
或可hashable objects
是什么意思?
从Python术语表 :
如果一个对象具有在其生命周期中从不改变的散列值(它需要
__hash__()
方法),并且可以与其他对象进行比较(它需要__eq__()
或__cmp__()
方法),则该对象是可散列的。 比较相等的哈希对象必须具有相同的哈希值。Hashability使对象可用作字典键和集合成员,因为这些数据结构在内部使用散列值。
所有Python的不可变内置对象都是可散列的,而没有可变容器(如列表或字典)。 对象是用户定义的类的实例默认可哈希; 他们都比较不等,他们的哈希值是他们的
id()
。
这里的所有答案都对python中的可哈希对象有很好的工作解释,但是我相信需要首先理解哈希术语。
散列是计算机科学中的一个概念,用于创build高性能,伪随机访问数据结构,其中大量数据将被快速存储和访问。
例如,如果您有一万个电话号码,并且想要将它们存储在一个数组(这是一个将数据存储在连续内存位置并提供随机访问的顺序数据结构),但您可能没有所需的连续数量内存位置。
因此,您可以改为使用大小为100的数组,并使用散列函数将一组值映射到相同的索引,并将这些值存储在链接列表中。 这提供了一个类似于数组的性能。
现在,散列函数可以像将数字除以数组的大小,并将余数作为索引一样简单。
有关更多详细信息,请参阅https://en.wikipedia.org/wiki/Hash_function
请参阅有关可__hash__()
和__hash__()
方法的文档。
让我给你一个工作的例子来理解python中的可哈希对象。 这个例子中我使用了2个元组。每个元组中的每个值都有一个独特的哈希值,在其生命周期中永远不会改变。 所以基于这个价值,两个元组之间的比较就完成了。 我们可以使用Id()来获取元组元素的哈希值。
在Python中,它意味着对象可以是集合的成员,以便返回索引。 也就是说,他们有唯一的身份/身份证。
例如,在Python 3.3中:
数据结构列表不可哈希,但数据结构元组可哈希。
据我了解,根据Python词汇表,当你创build一个可哈希对象的实例时,根据实例的成员或值计算不可更改的值。 例如,这个值可以被用作一个字典中的一个关键字,如下所示:
>>> 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]的值是相同的,这意味着当它们用作字典中的关键字时,它们返回相同的值,因为散列值是一样。 对于那些不可哈希的对象, 哈希方法定义为None:
>>> type(dict.__hash__) <class 'NoneType'>
我猜这个哈希值是在实例的初始化时计算的,而不是以dynamic的方式计算,这就是为什么只有不可变的对象是可散列的。 希望这可以帮助。
在python中,如果对象不可变,则对象是可散列的。
因此,可以被哈希是相同的,可以作为一个字典的索引。
例如,您可以使用string散列来创build字典,因为string不可变。
dict["a"] = something.
任何不可变的(可变意味着可能会改变)都可以被散列。 除了要查找的哈希函数,如果一个类有它,例如, dir(tuple)
和寻找__hash__
方法,这里是一些例子
#x = has(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
不可变types列表:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
可变types列表:
list, dict, set, bytearray, user-defined classes