python字典中的奇怪行为

python字典中的奇怪行为,python,python-3.x,dictionary,hash,cpython,Python,Python 3.x,Dictionary,Hash,Cpython,我在学习python哈希函数时遇到了以下行为 >>> hash(-1) -2 >>> hash(-2) -2 所以已经有一个很好的帖子回答了为什么: 由于python dictionary使用键的散列来存储值,因此需要以下输出,因为True和1具有相同的散列: >>> my_dict = { True: "true", 1: "one"} >>> my_dict {True: 'on

我在学习python哈希函数时遇到了以下行为

>>> hash(-1)
-2
>>> hash(-2)
-2
所以已经有一个很好的帖子回答了为什么:


由于python dictionary使用键的散列来存储值,因此需要以下输出,因为
True
1
具有相同的散列:

>>> my_dict = { True: "true", 1: "one"}
>>> my_dict
{True: 'one'}
>>> hash(True)
1
>>> hash(1)
1
但是,如果我尝试以下内容,我希望输出为
{-1:“减2”}
,因为
-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的,但我很想知道这种行为的原因。

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

>>> hash(-1)
-2
>>> hash(-2)
-2
>>> class Samesies:
...     def __hash__(self):
...             return 1
...     def __eq__(self, other):
...             return True
...
>>> {Samesies(): 1, Samesies(): 2}
{<__main__.Samesies object at 0x0000023997ACEFA0>: 2}
>>类相同:
...     定义散列(自我):
...             返回1
...     定义(自身、其他):
...             返回真值
...
>>>{Samesies():1,Samesies():2}
{: 2}

编辑:之所以
1==True
hash(1)==hash(True)
是因为
bool
实际上是
int
的子类,如果它只使用散列值,那么它是完全无用的,对吗?您无法自信地在其中存储任何内容,因为您无法确保它们具有不同的散列值。是的,它使用散列值,但是如果散列值相同,它也会检查是否相等。顺便说一句,它不是特定于CPython的,所有散列字典都有类似的实现。您看到此行为的唯一原因是,至少在CPython中,
1==True
。“由于python字典使用键的散列来存储值,因此需要以下输出,因为True和1都具有相同的散列。”不。这一事实本身并不意味着这一点。哈希和相等必须一致。