gpt4 book ai didi

python - 自定义类对象和 "in"集合运算符

转载 作者:行者123 更新时间:2023-12-04 00:13:37 25 4
gpt4 key购买 nike

我正在使用 Python 3.6。假设我试图保留一组唯一的元组。我知道我可以使用 tuple in set 并取回正确的结果(该集合是否包含元组)。

s = set()
t1 = (1, 2)
t2 = (1, 2)
s.add(t1)
print(t2 in s) # True -- Great!

现在,假设我有一个包含元组的自定义类。我想将自定义类对象的唯一性定义为元组的唯一性。我做了以下事情:

class TupleWrapper(object):

def __init__(self, t):
self.t = t # tuple

def __hash__(self):
return hash(self.t)


s = set()
t1 = TupleWrapper((1, 2))
s.add(t1)
t2 = TupleWrapper((1, 2))
print(t2 in s) # False -- WHY?

我编写了自己的 __hash__() 方法来散列元组。那么为什么在set中找不到相同元组的两个TupleWrapper对象呢?我需要重写其他方法吗?

最佳答案

您还需要在 TupleWrapper 上实现 __eq__

def __eq__(self, other):
if isinstance(other, TupleWrapper):
return self.t == other.t
return NotImplemented

否则,在检查对象是否已经在集合中时,将默认进行身份比较,即is(即t1 is t2id(t1) == id(t2)).

更详细:松散地说,在插入时,set(和 dict)首先使用哈希值来确定事物在哪个桶中。然后,在那个桶中,它使用 == 来检查,在哈希冲突的情况下,如果该对象已经存在。

哈希文档 here

关于python - 自定义类对象和 "in"集合运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65820556/

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