【问题标题】:Python 3 dict KeyError with right hash具有正确哈希的 Python 3 dict KeyError
【发布时间】:2018-07-22 14:11:16
【问题描述】:

我完全被这个问题所困扰。这在我看来是不可能的,但它确实发生了。

错误描述

假设我正在使用可散列类 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

奇怪,看起来字典已损坏或类似的东西......但是:

  • for k, v in d.items(): print(k, v) 效果很好!

如果我这样做:

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

那么d2[k1]d2[k2] 也可以正常工作。

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

【问题讨论】:

  • 考虑重读how-to-ask 并提供符合How to create a Minimal, Complete, and Verifiable example 的代码。如果没有您的代码和您正在操作的数据,很难提供帮助。
  • 您好,我自己还不能在一个小sn-p中重现该错误与您分享。
  • 你确定for k in d: print(d[k]) 提升KeyError?如果是这样,那么您的类的实现存在严重错误,除非您共享一些实际代码,否则我们无法帮助您。

标签: python-3.x dictionary hash key


【解决方案1】:

好的,我在Key hash()方法的实现上完全失败了。当属性发生变化(对象是可变的)时,我返回了一个不同的哈希!

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

哈希不匹配! ;)

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2015-01-21
    • 2014-05-15
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2020-06-17
    相关资源
    最近更新 更多