сравнение Python для деревьев, представленных в виде кортежей - PullRequest
1 голос
/ 27 июня 2011

Я представляю деревья с кортежами. Say

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

Правда ли, что при сравнении двух таких деревьев с == сначала проверяется, равны ли ссылки t2 и t5, а затем равны ли ссылки t3 и t6, если они не равны, то он пытается сравнить фактическое содержимое t2 и t5, а затем содержимое t3 и t6?
LE: Следующий код не вызывает __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__

   q=(C(1),C(2))
   p=(C(1),C(2))
   l=(q,q)
   f=(p,p)
   print l==f 

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

Да, кортежи пытаются замкнуть процесс сравнения, чтобы два кортежа были равны, если они являются одним и тем же кортежем или если их элементы либо идентичны, либо равны.

В частности:

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

, который кажется довольно разбитым.

3 голосов
/ 27 июня 2011

Из документации :

Типы последовательностей также поддерживают сравнения. В частности, кортежи и списки сравниваются лексикографически сравнивая соответствующие элементы. Это означает, что сравнивать равных, каждый элемент должен сравниваться равным и две последовательности должны быть одинаковыми типа и имеют одинаковую длину.

Подробности сравнений элементов также документированы .

1 голос
/ 27 июня 2011

Я сделал небольшой фрагмент кода, чтобы проверить ваши предположения:

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
...