2017-06-06 10 views
0

私はPythonで最短経路アルゴリズムを実装しようとしていました。私はパス上のポイントを接続しようとしたときにいくつかの問題に遭遇しました。私はこれらのノードの配列を作った後、このようにそれらに新しいノードを作成したノード と呼ばれるクラス持っPythonクラスの奇妙なことは?

nodes = [] 
for r in range (0, 3): 
    for c in range (0, 3): 
     nodes.append(NODE(c*WIDTH/20 + 30, r*HEIGHT/20 + 30, 10)) 

これは罰金であるノードを作成したが、私はうまくそれらを描くことができます。
最初にノードオブジェクトのリストをNODEクラスに追加して接続しようとしました。私はいくつかの問題に遭遇した、私は問題が再帰的なクラスであると思ったので、私はこれをテストした。
connectionsは、NODEクラス内の空の配列です。

nodes[0].connections.append(0) 
print nodes[0].connections 

nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

これは私が問題を見つけた場所です。たぶん私はばかだと思っていますか、それとも言語のことですか?ダニー、私は頼むと思った。

出力は次のとおりです、私はインデックスのみで接続リストに1つのオブジェクトを追加しました [0]
[0、1]
[0、1]

あなたが見ることができるように
1.しかし、私は内容を印刷するとき、私は2つを参照してください....そして、これは私を混乱させる。

+1

これは、実際の 'NODE'クラスを含む[mcve]が表示されなくても、本当に答えにくいです。 – Kevin

+2

私は、 'class Node'はコンストラクタの' connections'を新しいリストに初期化するのではなく、静的フィールド 'connections'を持っていて、すべてのオブジェクトが単一の接続リストを共有すると思いますか? 'Node'クラスを表示してください。 – dhke

+1

私は先に進んで、これが[変更可能なデフォルト引数](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument)の複製であると言うでしょう。 –

答えて

3

Possibilty 1:

class NODE: 
    connections = [] 
    def __init__(self, value): 
     self.value = value 

nodes = [NODE(23), NODE(42)] 

nodes[0].connections.append(0) 
print nodes[0].connections 
nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

ソリューション:クラスのインスタンスの属性が__init__内で定義する必要がありますあなたのコードは次のようになります。クラスレベルでconnectionsを定義すると、NODEのすべての単一インスタンスは同じ1つのconnectionsリストを共有します。

class NODE: 
    def __init__(self, value): 
     self.value = value 
     self.connections = [] 

可能性2:あなたのコードのようになります。

class NODE: 
    def __init__(self, value, connections = []): 
     self.value = value 
     self.connections = connections 

nodes = [NODE(23), NODE(42)] 

nodes[0].connections.append(0) 
print nodes[0].connections 
nodes[1].connections.append(1) 
print nodes[1].connections 
print nodes[0].connections 

ソリューション:引数リストのデフォルト値はそれほどNODEのすべてのインスタンスは、そのデフォルト値を使用して、一度だけ作成されます同じ1つのリストを共有します。引数が渡されなかったことを示すために、変更不可能なセンチネル値を使用します。 Noneが通常このタスクに適しています。

class NODE: 
    def __init__(self, value, connections = None): 
     self.value = value 
     if connections is not None: 
      self.connections = connections 
     else: 
      self.connections = [] 
+0

これはそれです。回答ありがとうございます !これは私の他の多くの問題を解決するつもりです! – suli