1

Node オブジェクトを作成して、Python で一般的なツリーを作成しました。各ノードは、0、1、または 2 つのツリーを持つことができます。

ツリー内のすべてのノードのリストを出力するメソッドを作成しようとしています。リストは順番通りである必要はありません。これが私の単純な試みです:

def allChildren(self, l = list()):
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

このメソッドを初めて実行すると、正しく機能します。ただし、何らかの理由で以前の実行が保存されています。メソッドを 2 回目に実行すると、すべてのノードが 2 回出力されます。2 つの別個のツリーを作成しても、以前の実行は記憶されています。例: a と b の 2 つのツリーを作成します。a.allChildren() を実行すると、正しい結果が得られます。次に、b.allChildren() を実行し、a のすべてのノードと b のすべてのノードを受け取ります。

4

3 に答える 3

5

関数パラメータのデフォルト値として変更可能な値がありますl。Python では、これは、 を呼び出すとl.append(self)、既定のパラメーターが永続的に変更されることを意味します。

この問題を回避するにlは、リストが渡されない場合、関数が呼び出されるたびに新しいリストを設定します。

def allChildren(self, l = None):
    if l is None:
        l = list()
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

この現象は、この質問でより詳しく説明されています。

于 2013-07-29T18:03:09.440 に答える
3

これを試して:

def allChildren(self, l = None):
    if(l==None):
        l = list()

    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

説明については、この回答をご覧ください。

于 2013-07-29T18:01:50.100 に答える