Python / Django递归函数在刷新时加倍结果

时间:2014-06-05 06:36:59

标签: python django recursion

这真的很奇怪 - 我有11个标签被传递到LabelTree。我第一次打电话给sort_by_hierarchy,一切都很好。

我刷新页面,AJAX调用被调用以调用此函数,然后返回22个标签。我再次刷新页面,44个标签。

我做错了什么?

class LabelTree:
    def __init__(self, labels):
        self.by_parent = {}
        self.by_id = {}

        for label in labels:
            parent_id = 0 if label.parent_id is None else label.parent_id

            if parent_id not in self.by_parent:
                self.by_parent[parent_id] = []

            self.by_parent[parent_id].append(label)
            self.by_id[label.id] = label

    def sort_by_hierarchy(self, parent_id=0, depth=0, hierarchical_labels=[]):
        if parent_id not in self.by_parent:
            return hierarchical_labels

        labels = self.by_parent[parent_id]

        for label in labels:
            label.depth = depth
            hierarchical_labels.append(label)

            hierarchical_labels = self.sort_by_hierarchy(label.id, depth+4, hierarchical_labels)

        return hierarchical_labels

1 个答案:

答案 0 :(得分:2)

问题在于:

def sort_by_hierarchy(self, parent_id=0, depth=0, hierarchical_labels=[]):

永远不要创建具有[]{}等默认值的参数,因为列表或dict只会创建一次,并且下一次调用方法将具有修改后的版本(前面带有标签)该列表是hierarchical_labels的默认值 请改用这个习语:

def sort_by_hierarchy(self, parent_id=0, depth=0, hierarchical_labels=None):
    if hierarchical_labels is None:
        hierarchical_labels = []