Python中基本的数据结构之一是字典,它允许记录“键”以查找任何类型的“值”。 它是内部实现为哈希表吗? 如果不是,那是什么?
Python中基本的数据结构之一是字典,它允许记录“键”以查找任何类型的“值”。 它是内部实现为哈希表吗? 如果不是,那是什么?
是的,它是哈希映射或哈希表。您可以阅读Tim Peters撰写的有关Python字典实现的描述,在此处查看。
这就是为什么您不能使用像列表这样的“不可哈希”对象作为字典键的原因:
>>> 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中是如何被实现的以及为什么要这样实现。.keys()
可以检索键列表。真正的哈希表不会存储键,只会存储哈希值以节省空间。 - noɥʇʎԀʎzɐɹƆPython 字典不仅仅是通过 hash() 进行表查找。通过粗略的实验,我发现了这个哈希碰撞:
>>> 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(1.1) == hash(214748749.8)
处发生冲突。)hash(1.1) == 230584300921369601
-- 所以我估计我的桌面需要一千年才能找到一个冲突。所以我会在此后再给你答复。)hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
这会给出一个19位十进制数 - 如果你够极客,那就是-4037225020714749784
。继续用自己的话说吧,孩子们,哈希仍然是一个19位数。我假设在Python中可以哈希的字符串长度有限,但可以肯定的是,可以哈希的字符串比可能的值要多得多。顺便说一下,hash(False)
=0。 - Will Croxford在nosklo的解释基础上,进一步解释:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
实现有关的文章。我会将其翻译为:假如你想了解技术细节,可以在Beautiful Code这本书中找到一篇介绍Pythondict
实现内部机制的文章。 - Torsten Marek