将功能移植到程序的Python 3.1 fork时遇到一个奇怪的错误。我将其缩小为以下假设:
与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
指向多个对象的对象,并为每个对象提供过去某个特定时间点的酱菜堆的值。每当检入现有对象时,变更跟踪器都会说出其新的泡菜与旧的泡菜是否相同,因此说明对象在此同时是否发生了变化。问题是,现在我什至无法检查给定的对象是否在库中,因为这使它引发有关该对象不可哈希的异常。(因为它有一种__eq__
方法。)如何解决此问题?
是的,如果您定义__eq__
,则默认值__hash__
(即对内存中对象的地址进行哈希处理)将消失。这很重要,因为散列必须与相等性保持一致:相等的对象需要对散列进行相同的散列。
解决方案很简单:只需将define__hash__
和define一起定义即可__eq__
。
我有一个模板结构。struct foo有嵌套类型。 我想使指针可哈希,这将适合
我正在对地图执行firestore查询 没有人工作过,任何帮助都是感激的 谢谢你抽出时间
问题内容: 从一个包含三列数据的文本文件中,我希望能够从第一列中的值等于中定义的值的所有三列中获取一个数据。然后,我想将数据切片放入一个名为(我正在使用 Python 2.7 )的新数组中 以上返回: 问题答案: 您的变量的形状可能不正确: 如果使用这种方法读取列数据,就会发生以下情况: 也许你可以简单地使用 代替。 (PS您的代码看起来像它的犹豫不决它是否还是。我认为它只是一个错字。)
问题内容: 我有一个包含多个列表作为其元素的列表 如果我使用内置的set函数从此列表中删除重复项,则会收到错误消息 我正在使用的代码是 TopP是一个列表,就像上面的eg一样 set()的这种用法是否错误?还有其他方法可以对以上列表进行排序吗? 问题答案: 集要求其项是可 哈希的 。在Python预定义的类型中,只有不可变的类型(例如字符串,数字和元组)是可哈希的。可变类型(例如列表和字典)不可散
任何实现了 Eq 和 Hash trait 的类型都可以充当 HashMap 的键。这包括: bool (当然这个用处不大,因为只有两个可能的键) int,unit,以及所有这类型的变量 String 和 &str(友情提示:可以创建一个由 String 构成键的 HashMap,并以一个 &str 来调用 .get())(原文:String and &str (protip: you can h
我是颤振初学者。我得到这样的JSON响应时出错。 我一直在论坛上寻找这个问题,我发现是这样的。 但我不懂如何编写函数。这是我的密码。 还有像这样的错误。 我很抱歉问了同样的问题,因为我不明白