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

Python/Django递归函数刷新时加倍结果,python,django,recursion,Python,Django,Recursion,这真的很奇怪-我有11个标签被传递到LabelTree。第一次调用sort\u by\u hierarchy,一切正常 我刷新页面,一个AJAX调用被触发来调用这个函数,然后它返回22个标签。我再次刷新页面,44个标签 我做错了什么 class LabelTree: def __init__(self, labels): self.by_parent = {} self.by_id = {} for label in labels:

这真的很奇怪-我有11个标签被传递到
LabelTree
。第一次调用
sort\u by\u 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
问题在于:

def sort_by_hierarchy(self, parent_id=0, depth=0, hierarchical_labels=[]):
切勿使用默认值创建参数,如
[]
{}
,因为列表或dict将只创建一次,并且方法的下一次调用将使用列表的修改版本(其中包含以前的标签)作为
分层标签的默认值
改用这个成语:

def sort_by_hierarchy(self, parent_id=0, depth=0, hierarchical_labels=None):
    if hierarchical_labels is None:
        hierarchical_labels = []
另外,请参见或以获取解释。