有一个具有重写__eq__
和__hash__
方法的类我使用集合来轻松查找(还有其他原因)。
class Foo:
def __init__(self, name, value):
self.name = name
self.value = value
def __eq__(self, other):
return self.value == other.value
def __hash__(self):
return self.value
def __repr__(self):
return "{} {}".format(self.name, self.value)
mylist = [Foo(None, 1), Foo(None, 2), Foo(None,3)]
reference = [Foo("a", 1), Foo("b", 2), Foo("c", 3)]
当我为结果集执行诸如union之类的操作时,显然python使用第一个集合:
print(set(mylist) | set(reference)) # {None 1, None 2, None 3}
print(set(reference) | set(mylist)) # {a 1, b 2, c 3}
我找不到有关此行为的任何文档。
这是否有正式定义?
或者只是未定义解释器设置union
s?
编辑为了说清楚:
两个集合上的并集在数学上是对称运算,此处的行为不对称。我能依靠吗?
答案 0 :(得分:-1)
我认为答案在你的班级定义中。
__eq__
检查值是否相等,而__hash__
返回值。因此,当集合统一时,一个集合的元素等于另一个集合的元素(各个值相等),这使得统一集合返回第一个指定集合。
答案 1 :(得分:-1)
您 eq 方法的实施仅基于'值'属性
将其更改为以下实现应该可以解决问题:
def __eq__(self, other):
return (self.value == other.value) and (self.name == other.name)