2017-10-16 1 views
0

私はPythonでオブジェクトのリストを使用して問題を抱えている:、一つの要素のメソッドを使用すると、リスト全体にこの方法を適用する

次のように私は、オブジェクトのリストを宣言しています:

ノードは、単純なクラスであることで
chain = [Node(1), Node(2), Node(3), 
    Node(4), Node(5), Node(6), 
    Node(7), Node(8), Node(9)] 

class Node: 

def __init__(self, data, links = []): 
    self.node_links = links 
    self.node_data = data 

def add_link(self, link): 
    self.node_links.append(link) 
(...) 
def to_str(self): 
    s = "node nb " + str(self.node_data) + " linked to:" 
    for link in self.node_links: 
     s += " Node " + str(link.node_to.node_data) 
    return s 
(...) 

すべては、私は私のリスト「チェーン」内の要素へのメソッドADD_LINK()を使用する場合を除き、ここに、から大丈夫です、それが実行されますすべてのeのメソッド私の鎖のlements。私のリストの例については

chain[0].add_link(Link(chain[3], 0.25)) 

for e in chain: 
    print(e.to_str()) 

ウィル出力

node nb 1 linked to: Node 4 
node nb 2 linked to: Node 4 
node nb 3 linked to: Node 4 
node nb 4 linked to: Node 4 
node nb 5 linked to: Node 4 
node nb 6 linked to: Node 4 
node nb 7 linked to: Node 4 
node nb 8 linked to: Node 4 
node nb 9 linked to: Node 4 

すべての要素は、私の文の影響を受けているように見えます。

私はこれにかなり困惑しています。私はどこでも検索しようとしましたが(コード&インターネット)、私は間違ったことを見つけることができません。誰にもアイデアはありますか?あなたは

def __init__(self, data, links = []): 

同じ[]を行う際に、マイケルButscherは、コメントで提供されたリンクを1として

+0

http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments –

+0

Pythonは、この動作を持っていることを奇妙に見えるかもしれませんが、しかし、それはキャッシュとして機能するなど、いくつかの状況で有用になる可能性があります。それでも、変更可能なデフォルトの引数を使用したい場合は、その動作を意図的に呼び出すことをコメントするのが良い考えです。さもなければ、あなたのコードを読んでいる人はそれがバグだと思うでしょう。 –

+0

皆様おかげさまで確かに、私のIDEでも、私は警告を無視したnoobとして、私はそれを調べていたはずです。 –

答えて

0

が使用されているので、すべてのノードが同じリストを参照しています。あなたは、あなたのコンストラクタを変更することができます。

def __init__(self, data, links=None): 
    self.node_links = links or [] 
    self.node_data = data 
関連する問題