gpt4 book ai didi

Python: `key not in my_dict` 但 `key in my_dict.keys()`

转载 作者:太空狗 更新时间:2023-10-30 02:23:29 26 4
gpt4 key购买 nike

我有一个奇怪的情况。我有一个字典,self.containing_dict。使用调试器,我看到了字典的内容,并且可以看到 self 是其中的一个键。但是看看这个:

>>> self in self.containing_dict
False
>>> self in self.containing_dict.keys()
True
>>> self.containing_dict.has_key(self)
False

这是怎么回事?

(我会注意到这是一段在弱引用回调上执行的代码。)

更新:我被要求展示self__hash__ 实现。在这里:

def __hash__(self):
return hash(
(
tuple(sorted(tuple(self.args))),
self.star_args,
tuple(sorted(tuple(self.star_kwargs)))
)
)

args = property(lambda self: dict(self.args_refs))

star_args = property(
lambda self:
tuple((star_arg_ref() for star_arg_ref in self.star_args_refs))
)

star_kwargs = property(lambda self: dict(self.star_kwargs_refs))

最佳答案

你描述的问题只能是self引起的已实现__eq__ (或 __cmp__ )而不实现随附的 __hash__ .如果你没有实现 __hash__方法,你应该这样做——通常你不能使用定义 __eq__ 的对象但不是 __hash__作为字典键,但是如果你继承了一个 __hash__可能会错过。

如果你执行 __hash__ ,你必须确保它以正确的方式运行:结果在对象的生命周期内不能改变(或者至少只要对象被用作字典键或设置项),并且它必须与__eq__ .对象的哈希值必须与其相等的对象相同(根据其 __eq____cmp__ 。)对象的哈希值可能与其对应的对象不同不等于,但不一定是。这些要求还意味着您不能获得 __eq__ 的结果。在对象的生命周期内发生变化,这就是为什么可变对象通常不能用作字典键的原因。

如果您的 __hash____eq__不匹配,Python 将无法在字典和集合中找到该对象,但它仍会显示在 dict.keys() 中和 list(set) ,这就是你在这里描述的。通常的实现方式__hash__方法是返回 hash()您在 __eq__ 中使用的任何属性或 __cmp__方法。

关于Python: `key not in my_dict` 但 `key in my_dict.keys()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701220/

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