2016-09-30 15 views
0

以下の関数は、実行するたびに値をそのリストに保持します。私は最近、Python 'gotcha'としてこの問題について、変更可能なデフォルト引数を使用していることを知りました。再帰関数のデフォルトのリスト値

どうすれば修正できますか?関数の外部にグローバル変数を作成すると同じ問題が発生します。関数にリストを渡すと、再帰が中断され、最初のレベルのカテゴリのみが表示されます。

def build_category_list(categories, depth=0, items=[]): 
    '''Builds category data for parent select field''' 
    for category in categories: 
     items.append((category.id, '-' * depth + ' ' + category.name)) 
     if category.children: 
      build_category_list(category.children, depth + 1) 
    return items 
+0

「再帰を中断する」関数にリストを渡すにはどうすればよいですか? 'items'をキーワード以外のパラメータにして、再帰呼び出しに' item'を追加し、関数を呼び出すときに新しいリストを渡すだけで動作します。 –

答えて

2

内部のリストを渡す必要はありません...私の好みはアントワーヌの回答を参照してください - 答えを構築するために、戻り値を使用し、また

def build_category_list(categories, depth=0, items=None): 
    if not items: 
     items = [] 
    '''Builds category data for parent select field''' 
    for category in categories: 
     items.append((category.id, '-' * depth + ' ' + category.name)) 
     if category.children: 
      build_category_list(category.children, depth + 1, items) 
                   ^^^^^ 
    return items 

:しかし、あなたは再帰をダウンリストを渡す必要があります再帰関数は、現在のリストへの後続の呼び出しの結果を連結するだけです。

def build_category_list(categories, depth=0): 
    '''Builds category data for parent select field''' 
    items = [] 
    for category in categories: 
     items.append((category.id, '-' * depth + ' ' + category.name)) 
     if category.children: 
      items += build_category_list(category.children, depth + 1) 
    return items 
1

null値をチェックするか、チェックすることで問題が解決します。