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']