有一个覆盖了 __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)]
当我对结果集执行类似联合的操作时,显然 python 使用第一个集合:
print(set(mylist) | set(reference)) # {None 1, None 2, None 3}
print(set(reference) | set(mylist)) # {a 1, b 2, c 3}
我找不到关于此行为的任何文档。
这个有正式的定义吗?
还是只是未定义解释器对 union 采取的设置?
编辑 说清楚:
两个集合的并集在数学上是对称运算,这里的行为是不对称的。我可以依靠它吗?
请您参考如下方法:
我认为答案在您的类定义中。
__eq__ 检查值是否相等,而 __hash__ 返回一个值。因此,当集合统一时,一个集合的元素与另一个集合的元素相等(各自的值相等),这导致统一集合返回第一个指定的集合。
