gpt4 book ai didi

python - 定义 `__eq__` 的类型是不可散列的?

转载 作者:行者123 更新时间:2023-11-28 19:11:02 25 4
gpt4 key购买 nike

在将功能移植到程序的 Python 3.1 分支时,我遇到了一个奇怪的错误。我将其缩小为以下假设:

与 Python 2.x 相比,在 Python 3.x 中,如果对象具有 __eq__ 方法,则它会自动不可散列。

这是真的吗?

这是 Python 3.1 中发生的事情:

>>> class O(object):
... def __eq__(self, other):
... return 'whatever'
...
>>> o = O()
>>> d = {o: 0}
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
d = {o: 0}
TypeError: unhashable type: 'O'

后续问题是,如何解决我的个人问题?我有一个对象 ChangeTracker,它存储一个指向多个对象的 WeakKeyDictionary,为每个对象提供过去某个时间点的泡菜转储值。每当 checkin 现有对象时,更改跟踪器都会说它的新泡菜是否与旧泡菜相同,因此会说该对象是否同时发生了变化。问题是,现在我什至无法检查给定对象是否在库中,因为它会引发有关对象不可散列的异常。 (因为它有一个 __eq__ 方法。)我该如何解决这个问题?

最佳答案

是的,如果您定义了 __eq__,则默认的 __hash__(即对内存中对象的地址进行哈希处理)将消失。这很重要,因为散列需要与相等性一致:相等的对象需要散列相同的对象。

解决方案很简单:只需定义 __hash__ 以及定义 __eq__

关于python - 定义 `__eq__` 的类型是不可散列的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186509/

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