为了账号安全,请及时绑定邮箱和手机立即绑定

Python字典是哈希表的示例吗?

Python字典是哈希表的示例吗?

偶然的你 2019-12-10 09:49:27
字典是Python中的一种基本数据结构,它允许记录“键”以查找任何类型的“值”。这在内部实现为哈希表吗?如果没有,那是什么?
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

是的,它是一个哈希映射或哈希表。您可以在此处阅读由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中实现以及为什么以这种方式实现。


查看完整回答
反对 回复 2019-12-10
?
互换的青春

TA贡献1797条经验 获得超6个赞

除了在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)。)


查看完整回答
反对 回复 2019-12-10
?
呼唤远方

TA贡献1856条经验 获得超11个赞

为了扩展nosklo的解释:


a = {}

b = ['some', 'list']

a[b] = 'some' # this won't work

a[tuple(b)] = 'some' # this will, same as a['some', 'list']


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 1437 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信