Python字典是一个哈希表的例子吗?
Python中的基本数据结构之一是字典,它允许用户logging“键”来查找任何types的“值”。 这是作为一个哈希表内部实现吗? 如果不是,那是什么?
是的,这是一个哈希映射或哈希表。 您可以阅读Tim Peters撰写的python的dict实现的描述。
这就是为什么你不能使用'不可哈希'作为一个字典键,像一个列表:
>>> a = {} >>> b = ['some', 'list'] >>> hash(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list objects are unhashable >>> a[b] = 'some' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list objects are unhashable
你可以阅读更多关于哈希表或者检查它是如何在python中实现的,以及为什么它是以这种方式实现的 。
如果您对技术细节感兴趣,那么Beautiful Code中的一篇文章将讨论Python的dict
实现的内部结构。
是。 在内部,它被实现为基于Z / 2( 源 )上的本原多项式的开放散列。
除了在hash()上进行表查找,还必须有更多的Python字典。 通过粗暴的实验,我发现这个哈希碰撞 :
>>> hash(1.1) 2040142438 >>> hash(4504.1) 2040142438
但是它并没有打破字典:
>>> d = { 1.1: 'a', 4504.1: 'b' } >>> d[1.1] 'a' >>> d[4504.1] 'b'
完整性检查:
>>> for k,v in d.items(): print(hash(k)) 2040142438 2040142438
可能还有另外一个查找级别超出了hash(),可以避免字典键之间的冲突。 或者也许dict()使用不同的散列。
(顺便说一下,在Python 2.7.10中,在Python 3.4.3和3.5.0中,在hash(1.1) == hash(214748749.8)
处发生冲突的情况是hash(1.1) == hash(214748749.8)
。)
扩展nosklo的解释:
a = {} b = ['some', 'list'] a[b] = 'some' # this won't work a[tuple(b)] = 'some' # this will, same as a['some', 'list']