Python 中的一种基本数据结构是字典,它允许人们记录“键”以查找任何类型的“值”。这是在内部实现为哈希表吗?如果不是,那是什么?
原文由 Tommy Herbert 发布,翻译遵循 CC BY-SA 4.0 许可协议
Python 中的一种基本数据结构是字典,它允许人们记录“键”以查找任何类型的“值”。这是在内部实现为哈希表吗?如果不是,那是什么?
原文由 Tommy Herbert 发布,翻译遵循 CC BY-SA 4.0 许可协议
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() 之外还有另一个查找级别可以避免字典键之间的冲突。或者 dict() 使用不同的散列。
(顺便说一下,这在 Python 2.7.10 中。Python 3.4.3 和 3.5.0 中的情况相同,但在 hash(1.1) == hash(214748749.8)
处发生碰撞。)
(我在 Python 3.9.6 中没有发现任何冲突。因为哈希更大 – hash(1.1) == 230584300921369601
我估计我的桌面需要一千年才能找到一个。所以我会回来的对你来说。)
原文由 Bob Stein 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答893 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
是的,它是哈希映射或哈希表。您可以 在此处 阅读 Tim Peters 撰写的 python 字典实现的描述。
这就是为什么你不能使用“不可哈希”的东西作为字典键的原因,比如列表:
您可以 阅读有关哈希表的更多信息, 或 查看它是如何在 Python 中实现的 以及 为什么以这种方式实现。