python - python字典的奇怪行为
问题描述
我正在学习 python 哈希函数并遇到以下行为。
>>> hash(-1)
-2
>>> hash(-2)
-2
SO 已经有一篇很棒的帖子回答了原因:为什么 -1 和 -2 在 CPython 中都散列为 -2?
由于 python 字典使用键的哈希值来存储值,因此预期以下输出,因为两者True
和1
具有相同的哈希值:
>>> 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 的,但我很想知道这种行为的原因。
解决方案
它不仅检查对象的哈希值,还检查对象的相等性。您可以通过以下示例看到这一点:
>>> 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
。
推荐阅读
- android - 从 Kotlin 的 Mapbox 获取我的位置 LatLng
- c++ - 刚刚在锻炼测试中捕获了致命信号 11
- javascript - 如何让我的 Discord 机器人赋予用户角色?
- ios - 从 TimerCallback 实例调用时,对 Dropbox API Client.Files.DownloadAsync 的调用不返回元数据
- xml - 使用 XPath 选择包含具有属性值的子元素的所有元素
- python - 将列表添加到列表中,然后将另一个列表添加到刚刚添加的列表中
- c - C 战舰游戏链表 print_node 函数
- applescript - 如何通过 AppleScript 在 Illustrator 2020 中打开文件
- css - 为什么有时 Chrome 开发工具会显示 scss 文件而不是编译后的 css 文件?
- google-sheets - 使用 Importdata 拉另一个 googlesheet