python字典哈希冲突

在GitHub看的题,做个笔记。

some_dict = {}
some_dict[5.5] = "Ruby"
some_dict[5.0] = "JavaScript"
some_dict[5] = "Python"
print(some_dict[5.5],some_dict[5.0],some_dict[5])
"Ruby" "Python" "Python"

为什么会这样呢?some_dict[5]将some_dict[5.0]覆盖掉了。
大家都知道整形和浮点型都是不可变类型,但是对于字典来说它们是不是唯一的呢?

print(id(5.0),id(5))
print(5.0 == 5)
print(hash(5.0) == hash(5))

125207608 1704830176
True
True

虽然存储地址不同,但是显然他们的值相同,且对于字典来说5与5.0具有相同哈希值,所以some_dict[5]会覆盖some_dict[5.0]。

说明:

  • Python字典检查相等性并比较哈希值以确定两个键是否相同。
  • 具有相同值的不可变对象在Python中始终具有相同的哈希值。
    注意:具有不同值的对象也可能具有相同的哈希值(称为哈希冲突)。
  • some_dict[5] = "Python"执行语句时,现有值“JavaScript”被“Python”覆盖,因为Python识别5并且5.0与字典的键相同some_dict。

所以以后使用字典的时候要注意啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容