gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:42:42 26 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/1608842/

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