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

2024-05-23 22:04:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这真的很奇怪-我有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

Tags: inselfidbylabelsifhierarchy页面
1条回答
网友
1楼 · 发布于 2024-05-23 22:04:29

问题在于:

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 = []

相关问题 更多 >