gpt4 book ai didi

python - 即使实际设置了键,字典也会在查找时引发 KeyError

转载 作者:行者123 更新时间:2023-12-01 07:54:49 26 4
gpt4 key购买 nike

当我尝试打印字典(或其 __dict__)时,会引发 KeyError。该字典是从 MyClass 实例到 float 和整数的映射。分享MyClass的源代码太长了。

d = dict()
d[MyClass()] = 10.023
d[MyClass()] = 1.023
d[MyClass()] = 8
print(d)
Out[16]: ---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
c:\users\[...]\lib\site-packages\IPython\core\formatters.py in __call__(self, obj)
700 type_pprinters=self.type_printers,
701 deferred_pprinters=self.deferred_printers)
--> 702 printer.pretty(obj)
703 printer.flush()
704 return stream.getvalue()

[...]

618 p.pretty(key)
619 p.text(': ')
--> 620 p.pretty(obj[key])
621 p.end_group(step, end)
622 return inner

KeyError: <MyClass.subclass instance>

以下还会引发 KeyError:

for key in d:
print(d[key])

尽管在引发错误之前某些值已正确打印。查找某些特定键似乎遇到困难。

我觉得这也很奇怪:

In [19]: [a in d for a in d]
Out[19]: [False, True, False, True, False]

最后:

list(d) # works fine, just like d.keys() and d.values()
Out[19]: [<MyClass.subclass instance>,<MyClass.subclass instance>,<MyClass.subclass instance>,...]
d[list(d)[0]] # works fine
Out[20]: 10.023
d[list(d)[1]] # raises KeyError
list(d)[1] in d # returns False
list(d)[0] in d # returns True

我查了一下: - 所有 key 都有不同的哈希值 - 列表(d)不包含重复项 - 正确查找的 list(d) 实例没有明显差异(有些甚至是同一类的实例) - 列表项

我想不出对此行为的解释。今天才体现出来。我最近对包含 MyClass 的模块的文件结构进行了一些更改。之前:MyClass 子类与 MyClass 定义位于同一文件中。之后:同一目录中各个文件中的 MyClass 子类。我看不出这会如何影响其中任何一个,但谁知道呢。

最佳答案

在正常情况下,这种情况不应该发生。

但是,您可能会违反字典约定,即键在相等性和哈希方面必须是不可变的。因为如果哈希值发生变化,则无法再找到对象。

Mapping Types — dict

[...]

A dictionary’s keys are almost arbitrary values. Values that are not hashable, that is, values containing lists, dictionaries or other mutable types (that are compared by value rather than by object identity) may not be used as keys.

为了演示当您将可变对象与取决于值的哈希函数一起使用时会发生什么:考虑这个类:

class Test:
def __init__(self, value):
self.value = value

def __hash__(self):
return self.value

还有这个小片段:

>>> t1 = Test(1)
>>> d = {}
>>> d[t1] = 10
>>> t1.value = 2 # t1's hash also changes at this point
>>> d[t1]
KeyError: <__main__.Test object at 0x0000020FCA5AD748>

这当然过于简化,但我怀疑您的代码中会发生类似的情况。我建议您在程序执行期间监视与 __hash____eq__ 相关的值的更改。

关于python - 即使实际设置了键,字典也会在查找时引发 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56036954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com