Answers:
是的,它是一个哈希映射或哈希表。您可以在此处阅读由蒂姆·彼得斯(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
.keys()
可以检索键列表。真正的哈希表不会存储键,而只是散列以节省空间。
除了在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('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。
dict
实现的内部。