Python - 关于散列和 `None` 的问题

标签 python

为什么 None 散列为 -1042159082(我发现它等于 Gigabyte 的字节数取反)?

我意识到这并没有真正影响我的代码,但我很好奇。

哈希用于字典键查找,所以我决定试验一下:

>>> D = {-1042159082: 'Hello', None: 'Hi'}
>>> D[None]
'Hi'
>>> D[-1042159082]
'Hello'
>>>

我将此理解为 Python 看到两个相同的散列,然后检查类型以查看什么是什么。是吗?

>>> {False: 'Hello', 0: 'Hi'}
{False: 'Hi'}
>>> {0: 'Hi', False: 'Hello'}
{0: 'Hello'}

这很奇怪。更重要的是,第一个键保留,第二个值保留。

这是魔法吗,或者谁能帮我理解一下?

最佳答案

大约 2 个值在传递给内置 hash() 函数时可能会产生相同的输出(None-1042159082问的问题):

这称为碰撞(有关碰撞的更多信息,请参阅维基百科上的 this 页面)。

Python 使用的散列算法有一种特殊的方法来确定发生碰撞时人们真正想要的值(参见 CPython(主要 Python 解释器)源代码中的 this 页,从第 51 行开始,关于字典冲突的信息,在写这个答案的时候;this 文件也有关于字典如何实现的注释。

关于 0False 会发生什么(以及更多有用的信息),请参阅当前问题的其他答案。

关于Python - 关于散列和 `None` 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447559/

相关文章:

python - 如何在 Python 中使用 pandas 满足特定条件后删除观察结果

c++ - 使用 gcc 4.2 在 Mac OS X 10.6.8 上安装 lxml

python - 将python中的值保存到mysql数据库

python - 循环中的多处理问题

python - 使用 python 进行子进程管理

python - 查找 cv2.findContours() 的面积(Python、OpenCV)

python - 如何在python中将给定的随机生成的字母打印成矩阵的形式

Python - 如何查看*所有* HTTP 连接进出我的机器?

python - 尽管存在相关性,为什么 R2 为负?

python - 如何检查类型是否是 Python 中类型的子类型?