首页 > 解决方案 > python字典的奇怪行为

问题描述

我正在学习 python 哈希函数并遇到以下行为。

>>> hash(-1)
-2
>>> hash(-2)
-2

SO 已经有一篇很棒的帖子回答了原因:为什么 -1 和 -2 在 CPython 中都散列为 -2?

由于 python 字典使用键的哈希值来存储值,因此预期以下输出,因为两者True1具有相同的哈希值:

>>> my_dict = { True: "true", 1: "one"}
>>> my_dict
{True: 'one'}
>>> hash(True)
1
>>> hash(1)
1

但是,如果我尝试以下操作,我希望输出为{ -1: "Minus Two"}, 因为-1并且-2具有相同的哈希值。但事实并非如此。

>>> my_dict = { -1: "Minus One", -2: "Minus Two"}
>>> my_dict
{-1: 'Minus One', -2: 'Minus Two'}
>>> hash(-1)
-2
>>> hash(-2)
-2

这种行为的原因是什么?字典不使用键的哈希值来存储它的值吗?

注意:我知道它是特定于 CPython 的,但我很想知道这种行为的原因。

标签: pythonpython-3.xdictionaryhashcpython

解决方案


它不仅检查对象的哈希值,还检查对象的相等性。您可以通过以下示例看到这一点:

>>> class Samesies:
...     def __hash__(self):
...             return 1
...     def __eq__(self, other):
...             return True
...
>>> {Samesies(): 1, Samesies(): 2}
{<__main__.Samesies object at 0x0000023997ACEFA0>: 2}

1 == True编辑:的原因hash(1) == hash(True)是因为实际上bool是子类int


推荐阅读