Python 3使用正确的哈希来解决KeyError问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 3使用正确的哈希来解决KeyError问题相关的知识,希望对你有一定的参考价值。

我完全陷入了这个问题。这对我来说似乎不可能,但它确实发生了。

错误的描述

假设我正在使用hashable类Key的对象来存储类Value的对象在python 3本机dict中。目前,dict只包含一个键和一个值。

在程序后期我尝试使用键k1(d[k1])检索值v1时,我得到一个KeyError。它发生了,这里不需要问题。但是:

到目前为止我尝试了什么

我使用PyDev的调试器控制台来检查变量并找到错误。在分配d[k1] = v1之后,我可以毫无问题地访问v1。

在发生错误的地方,我使用k2 = list(dict)[0]检索了密钥。然后,即使使用dict中的k2,我在执行d[k2]时也得到了相同的KeyError!

  • 以防万一:type(d) => class'dict'
  • 相同的哈希:hash(k1)等于hash(k2) => -6069959488783444446
  • 等于:k1.__equals__(k2)k1 == k2 =>真

尝试其他一些东西:

  • d[list(d)[0]]提出了一个KeyError
  • for k in d: print(d[k])提出了一个KeyError

很奇怪,看起来dict已经损坏或类似的东西......但是:

  • for k, v in d.items(): print(k, v)工作得非常好!

如果我这样做:

d2 = {}
for k, v in d.items():
    d2[k] = v

然后d2[k1]d2[k2]也运作良好。

有人遇到过那种问题吗?我完全没有想法......

答案

好吧,我完全没有实现Key hash()方法。当改变的属性(对象是可变的)时,我返回了一个不同的哈希!

我解决了它,但在hash()中使用了id()函数。

哈希不匹配! ;)

以上是关于Python 3使用正确的哈希来解决KeyError问题的主要内容,如果未能解决你的问题,请参考以下文章

Python数据结构-哈希表(Hash Table)

Python3-hashlib模块-加密算法之安全哈希

Torrent Tracker 信息哈希 GET 请求 - Python

[C++] 位图-布隆过滤器-海量数据的处理问题

[C++] 位图-布隆过滤器-海量数据的处理问题

[C++] 位图-布隆过滤器-海量数据的处理问题