您的位置:首页技术文章
文章详情页

python。对象集中的身份。和散列

【字号: 日期:2022-08-07 14:00:37浏览:2作者:猪猪
如何解决python。对象集中的身份。和散列?

用于dict /set目的的相等性取决于所定义的相等性__eq__。但是,要求比较相等的对象具有相同的哈希值,这就是为什么需要的原因__hash__。请参阅此问题进行类似的讨论。

哈希本身无法确定两个对象在字典中是否计数相同。哈希就像“快捷方式”,只能以一种方式起作用:如果两个对象具有不同的哈希,则它们肯定是不相等的;但是如果它们具有相同的哈希值,它们可能仍然不相等。

在您的示例中,您定义__hash__并__eq__要做其他事情。哈希仅取决于多米诺骨牌上数字的总和,但相等性取决于两个单独的数字(按顺序)。这是合法的,因为仍然存在相同的多米诺骨牌具有相同的哈希值的情况。但是,就像我上面所说的,这并不意味着等和的多米诺骨牌将被视为相等。一些不相​​等的多米诺骨牌将仍然具有相等的哈希值。但是相等性仍然由决定__eq__,并且__eq__仍然按顺序查看两个数字,因此这就是确定它们是否相等的原因。

在我看来,在您的情况下,适当的做法是同时定义这两个数字__hash__并__eq__依赖于 有序对-即首先比较两个数字中较大的一个,然后比较较小的两个。这意味着2-1和1-2将被视为相同。

解决方法

__hash__和__eq__在集合识别中如何使用?例如,一些有助于解决多米诺骨牌难题的代码:

class foo(object): def __init__(self,one,two):self.one = oneself.two = two def __eq__(self,other):if (self.one == other.one) and (self.two == other.two): return Trueif (self.two == other.one) and (self.one == other.two): return Truereturn False def __hash__(self):return hash(self.one + self.two)s = set()for i in range(7): for j in range(7):s.add(foo(i,j))len(s) // returns 28 Why?

如果我仅使用__eq__()len(s)等于49。就可以了,因为据我了解,对象(例如1-2和2-1)不相同,但是代表相同的多米诺骨牌。因此,我添加了哈希函数。现在它可以按我想要的方式工作,但是我不明白一件事:1-3和2-2的哈希值应该相同,因此它们应该像相同的对象一样计数,不应添加到集合中。但是他们做到了!我卡住了。

标签: Python 编程
相关文章: