Мне очень трудно было понять основную причину проблемы в алгоритме. Затем, упростив функции шаг за шагом, я обнаружил, что оценка аргументов по умолчанию в Python не ведет себя так, как я ожидал.
Код выглядит следующим образом:
class Node(object):
def __init__(self, children = []):
self.children = children
Проблема заключается в том, что каждый экземпляр класса Node имеет один и тот же атрибут children
, если атрибут не указан явно, например:
>>> n0 = Node()
>>> n1 = Node()
>>> id(n1.children)
Out[0]: 25000176
>>> id(n0.children)
Out[0]: 25000176
Я не понимаю логику этого дизайнерского решения? Почему дизайнеры Python решили, что аргументы по умолчанию должны оцениваться во время определения? Это кажется мне очень противоречивым.