表示为元组的树的python比较

时间:2011-06-27 12:41:50

标签: python tree comparison tuples

我用元组代表树。说

t1=(t2,t3) and t4=(t5,t6)  

将两个这样的树与==进行比较时,它首先测试引用t2t5是否相等,然后引用t3和{{1}如果它们不相等,那么它会尝试比较t6t2的实际内容,然后是t5t3的内容? 的 LE 以下代码不会调用t6似乎我的假设是正确的,并且它不会像我从文档中理解的那样递归地评估元组。

__eq__

另一方面,此代码会调用class C: def __init__(self,a): self.a=a def __eq__(self,oth): print self.a,oth.a return oth.a==self.a p=(C(1),C(2)) l=(p,p) f=(p,p) print l==f

__eq__

3 个答案:

答案 0 :(得分:3)

来自documentation

  

序列类型也支持   比较。尤其是元组和   列表按字典顺序进行比较   通过比较相应的元素。   这意味着要比较平等,   每个元素必须比较平等和   两个序列必须相同   类型和长度相同。

有关元素比较的详细信息也是documented

答案 1 :(得分:3)

是的,元组试图使比较过程短路,因此如果它们是相同的元组或者它们的元素相同或相等,则两个元组是相等的。

特别是:

>>> nan = float('NaN')
>>> left = (nan, nan)
>>> right = (nan, nan)
>>> left==right
True
>>> left[0]==right[0]
False

看起来很糟糕。

答案 2 :(得分:1)

我已经做了一些代码片段来测试你的假设:

class Foo(object):
    def __init__(self, value):
        self.value=value
    def __eq__(self, other):
        print "eq %s with %s"%(self, other)
        return other.value == self.value
    def __cmp__(self, other):
        print "cmp with %s"%other
        return cmp(other.value, self.value)
    def __str__(self):
        return "%s(%s)"%(self.__class__.__name__, self.value)


t1 = (Foo(1), Foo(2))
t2 = (Foo(1), Foo(3))

print t1 == t2

输出:

eq Foo(1) with Foo(1)    # equality testing of first item of tuple t1/t2
eq Foo(2) with Foo(3)    # equality testing of second item of tuple t1/t2
False