1

ツリーのような構造(クラス:Scan_instance_tree)を設定するアルゴリズムがありますが、残念ながら、各呼び出し中に、ルートノードの子と、ツリーのさらに下に作成された新しい子ノードに誤って追加されます。

手がかりとして、私は別のスレッドを見ました...

再帰的なPython関数の永続オブジェクト

...この問題について簡単に説明し、渡されたパラメータは変更可能である必要があることが示唆されました。それが答えであり、この例では、これをどのように行うのでしょうか?

これが私の現在のコードです:

class Field_node(object):
    field_phenotype_id = -1
    field_name = ''
    field_parent_id = -1
    child_nodes = []          


class Scan_instance_tree(object):
    root_node = None  

    def __init__(self, a_db):
        self.root_node = Field_node()
        scan_field_values = self.create_scan_field_values(a_db)   # This just creates a temporary user-friendly version of a database table    
        self.build_tree(scan_field_values)  

    def build_tree(self, a_scan_field_values):
        self.root_node.field_name = 'ROOT'      
        self.add_child_nodes(a_scan_field_values, self.root_node)


    def add_child_nodes(self, a_scan_field_values, a_parent_node):
        i = 0
        while i < len(a_scan_field_values):
            if a_scan_field_values[i]['field_parent_dependancy'] == a_parent_node.field_phenotype_id:
                #highest_level_children.append(a_scan_field_values.pop(a_scan_field_values.index(scan_field))) 
                child_node = Field_node()
                child_node.field_phenotype_id = a_scan_field_values[i]['field_phenotype_id']
                child_node.field_name = a_scan_field_values[i]['field_name']
                child_node.field_parent_dependancy = a_scan_field_values[i]['field_parent_dependancy']

                a_parent_node.child_nodes.append(child_node)
                a_scan_field_values.remove(a_scan_field_values[i])

                # RECURSION: get the child nodes
                self.add_child_nodes(a_scan_field_values, child_node)
            else: 
                i = i+1

self.add_child_nodes(...)への再帰呼び出しを削除すると、ルートの子が正しく追加されます。つまり、field_parent_dependancy = -1のノードのみで構成されます。再帰呼び出しを許可すると、ルートの子にはすべてのノードが含まれます。 、field_parent_dependancy値に関係なく。

よろしくお願いします

アン

4

1 に答える 1

2

Field_nodeクラスを定義するとき、行

    child_nodes = []

は、実際には、クラスのすべてのインスタンスによって共有されるインスタンス属性ではなく、クラス属性として単一のリストをインスタンス化します。

代わりに行うべきことは__init__、たとえば次のようにインスタンス属性を作成することです。

class Field_node(object):
    def __init__(self):
        self.field_phenotype_id = -1
        self.field_name = ''
        self.field_parent_id = -1
        self.child_nodes = []
于 2012-12-20T13:56:15.367 に答える