我用元组代表树。说
t1=(t2,t3) and t4=(t5,t6)
将两个这样的树与==
进行比较时,它首先测试引用t2
和t5
是否相等,然后引用t3
和{{1}如果它们不相等,那么它会尝试比较t6
和t2
的实际内容,然后是t5
和t3
的内容?
的 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__
答案 0 :(得分:3)
序列类型也支持 比较。尤其是元组和 列表按字典顺序进行比较 通过比较相应的元素。 这意味着要比较平等, 每个元素必须比较平等和 两个序列必须相同 类型和长度相同。
有关元素比较的详细信息也是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