2013-07-14 14 views
0

我有一個類別/葉實現以下類:Python的類別樹/葉類保持變量State

class CategoryMapper(): 
    @staticmethod 
    def get_tree(): 
     categories = [] 
     tree_categories = Category.objects.filter(parent_id__isnull = True) 
     for tree_category in tree_categories: 
      leaf_categories = CategoryMapper.get_leafs(tree_category) 
      categories += leaf_categories 

     return categories 

    @staticmethod 
    def get_leafs(tree_category, leaf_categories = [], depth = 0): 
     if depth > 0: 
      child_categories = Category.objects.filter(parent_id__exact = tree_category.id) 
      if len(child_categories): 
       depth += 1 
       for sub_category in child_categories: 
        sub_category_name = ((depth - 1) * '-') + sub_category.category 
        leaf_categories.append([sub_category.id, sub_category_name]) 

        return CategoryMapper.get_leafs(sub_category, leaf_categories, depth) 
      else: 
       return leaf_categories 
     else: 
      leaf_categories.append([tree_category.id, tree_category.category]) 
      depth += 1 

      return CategoryMapper.get_leafs(tree_category, leaf_categories, depth) 

我有以下日期: ID |分類|父ID 1 |測試1 |無 2 |測試和1名兒童| 1 3 |測試2 |無

當我運行它(CategoryMapper.get_tree())我得到:

[[1, u'Test 1'], [2, u'-Test 1 Child'], [1, u'Test 1'], [2, u'-Test 1 Child'], [3, u'Test 2']] 

當我再次運行它,我得到:

[[1, u'Test 1'], [2, u'-Test 1 Child'], [3, u'Test 2'], [1, u'Test 1'], [2, u'-Test 1 Child'], [1, u'Test 1'], [2, u'-Test 1 Child'], [3, u'Test 2'], [1, u'Test 1'], [2, u'-Test 1 Child'], [3, u'Test 2']] 

這就像在get_tree的類別變量()是有它的狀態保持每次通過tree_categories去當for循環跑。我究竟做錯了什麼?爲什麼它保持這樣的狀態?

回答

2

啊,你需要避免使用可變對象作爲函數的默認參數,如[]。相反,只需定義get_leafs像這樣:

def get_leafs(tree_category, leaf_categories = None, depth = 0): 
    if leaf_categories is None: 
     leaf_categories = [] 
    … 
+0

太棒了,非常感謝你!我現在就可以快速瞭解可變對象。 – Darren