集合运算中对象的行为

2024-03-29 04:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个自定义对象,该对象在set操作中正常工作。

我一般都能做到,但我想确保我完全理解其中的含义。特别是,当对象中有不包含在equal/hash方法中的其他数据时,我对这种行为很感兴趣。似乎在“intersection”操作中,它返回要比较的对象集,其中“union”操作返回要比较的对象集。

举例说明:

class MyObject:
    def __init__(self,value,meta):
        self.value = value
        self.meta = meta
    def __eq__(self,other):
        return self.value == other.value
    def __hash__(self):
        return hash(self.value)

a = MyObject('1','left')
b = MyObject('1','right')
c = MyObject('2','left')
d = MyObject('2','right')
e = MyObject('3','left')
print a == b # True
print a == c # False

for i in set([a,c,e]).intersection(set([b,d])):
    print "%s %s" % (i.value,i.meta)
#returns:
#1 right
#2 right

 for i in set([a,c,e]).union(set([b,d])):
    print "%s %s" % (i.value,i.meta)
#returns:
#1 left
#3 left
#2 left

这种行为是否在某个地方被记录下来并具有确定性?如果是的话,管理原则是什么?


Tags: 对象selfrightreturnvaluedefhashleft