python – 在Dictionary键中对象不被认为是相同的 – 但实现了__eq__

python – 在Dictionary键中对象不被认为是相同的 – 但实现了__eq__,第1张

概述以下代码给出了一条错误消息: class Test(object): def __init__(self, test = 0): self.test = testif __name__ == '__main__': t1 = Test(1) t2 = Test(2) t3 = Test(3) t4 = Test(1) my_di 以下代码给出了一条错误消息:

class Test(object):    def __init__(self,test = 0):        self.test = testif __name__ == '__main__':    t1 = Test(1)    t2 = Test(2)    t3 = Test(3)    t4 = Test(1)    my_dict = {}    my_dict[t1] = 1    my_dict[t2] = 2    my_dict[t3] = 3    print(my_dict[t4])Traceback (most recent call last):  file "C:\Users\Alexander\documents\Visual Studio 2015\Projects\PipeProcesstest\PipeProcesstest\DictionaryKeys.py",line 16,in <module>    print(my_dict[t4])KeyError: <__main__.Test object at 0x0000000002F18080>

这是因为python将t1和t4视为不同的对象.但是,当我使用以下代码实现比较运算符’eq’时:

def __eq__(self,other):        if self.test == other.test:            return True        else:            return False

我收到另一条错误消息,“unhashable type:’Test’”告诉我现在字典不能散列Test对象.我该如何解决这个问题,以便Python能够识别t1和t4是否相同,还能够对Test对象进行哈希处理?

解决方法 这是因为python将t1和t4视为不同的对象.但是,当我使用以下代码实现比较运算符’eq’时:

当您在python中执行此 *** 作时….

class Test(object):    def __init__(self,test = 0):        self.test = testif __name__ == '__main__':    t1 = Test(1)    t2 = Test(2)    t3 = Test(3)    t4 = Test(1)    my_dict = {}    my_dict[t1] = 1    my_dict[t2] = 2    my_dict[t3] = 3

这意味着您实际上正在尝试使用键作为Test对象创建一个dict,Python会首先检查键是否可以清洗.

当它返回obj .__ hash __()方法的任何整数值时,Python中的任何对象都是可散列的.在python中,默认情况下,所有用户定义的类都会获得一些ID(self)的哈希值.

显然当你得到ID值作为它的哈希值时,它们会看起来像这个值8772302607193.如果我们构造哈希表,它们可能看起来像这样的ID.

让我们假设ID是这样的……

ID(t1) = 1ID(t2) = 4   # These are just assumptions.ID(t3) = 10  # actual ID's are long values.ID(t4) = 20

这是哈希表的构造方式….

hash     Actual    value    value      ------------------    | 1    |  t1     |    ------------------    | 2    | NulL    |    ------------------   # ConsIDer that you've respective values are    | 3    | NulL    |   # here,just for representation I've mentioned    ------------------   # t1,t2,t3,t4,..    | 4    | t2      |    ------------------           |           |    ------------------    | 10   |  t3     |    ------------------           |         SO ON

像这样你的哈希表被构造,所以这里当你尝试获取t4的值时只需要尝试my_dict [t4].首先通过调用t4 .__ hash __()来检查t4的哈希值,假设t4哈希值为20.

获取哈希值20后,它检查哈希表,索引为20,因为我们没有插入任何值,只是引发了KeyError异常,这就是你在尝试my_dict [t4]时得到KeyError的原因.

另一个场景:

如果您尝试覆盖__hash__方法f测试类并继续执行您在下面执行的相同 *** 作.

class Test(object):    def __init__(self,test = 0):        self.test = test    def __hash__(self):        self.test       # You are just returning the same valueif __name__ == '__main__':    t1 = Test(1)    t2 = Test(2)    t3 = Test(3)    t4 = Test(1)    my_dict = {}    my_dict[t1] = 1    my_dict[t2] = 2    my_dict[t3] = 3

由于我们重载了hash方法以返回与初始化相同的值,下面是我们得到的哈希值

t1 = 1,t2 = 2,t3 = 3,t4 = 1

当我们有多个具有相同哈希值的值时,这就是哈希表的样子.

hash    Actual      value   value        ------------------      | 1    | [t1,t4] | # List of values for the same hash value.      ------------------      | 2    |  t2     |      ------------------ # ConsIDer that you've respective values are      | 3    |  t3     | # here,just for representation I've mentioned      ------------------ # t1,...      | 4    |  NulL   |      ------------------           |         SO ON

在这种情况下,当您尝试获取my_dict [t4]时,如前所述,首先检查哈希值t4 .__ hash __()返回1.现在Python dict检查哈希表中的索引1并获得多个值[t1,t4 ].

这就是__eq__帮助您在具有相同哈希值的多个值时识别对象的情况.你可以这样做以避免这种情况……

class Test(object):    def __init__(self,test = 0):        self.test = test    def __hash__(self):        return self.test    def __eq__(self,other):        return self is other

在您的情况下,您只需要验证self.test值以获取对象…

class Test(object):    def __init__(self,other):        return other.test == self.test

这就是你如何管理你的字面值!

总结

以上是内存溢出为你收集整理的python – 在Dictionary键中对象不被认为是相同的 – 但实现了__eq__全部内容,希望文章能够帮你解决python – 在Dictionary键中对象不被认为是相同的 – 但实现了__eq__所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1194973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存