sách gpt4 ai đã đi

Python: `key không có trong my_dict` nhưng `key có trong my_dict.keys()`

In lại Tác giả: Space Dog 更新时间:2023-10-30 02:23:29 27 4
mua khóa gpt4 Nike

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

>>> self in self.containing_dict
SAI
>>> self in self.containing_dict.keys()
ĐÚNG VẬY
>>> self.containing_dict.has_key(self)
SAI

这是怎么回事?

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

làm mới:我被要求展示bản thân của__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))

1 Câu trả lời

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

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

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

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

27 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com