2012-02-20 2 views
2

私はいくつかのPythonのものに悩まされています。私はクラスの7つのコピーを持っているリストを持っており、私はそれらのうちの1つの値だけを変更しようとしていますが、私がそうする度に、すべての値を変更します。ここで Pythonのクラスリストの発行

クラスです:

class Node: 
    previous = -1 
    distFromSrc = 1000000 
    visited = False 

そして、ここで私は、リストを作成する方法である:

def createNodeTable(network): 
    nodeTable = [] 
    for line in network: 
    nodeTable.append(Node) 
    return nodeTable 

'ネットワーク' 私は「nodeTable [Xを印刷するので、長さ7のリストです] .visited 'の値を変更しようとすると、私はすべての値が「False」になります。

私が次の関数を呼び出すと、変更しようとしているものだけでなく、 '.visited'の値もすべてfalseに変わります。 Iに変更されたものは何でも「currentNodeの」

は同じ問題を得る:

def setVisited(currentNode, nodeTable): 
    nodeTable[currentNode].visited = True 
    return nodeTable 

はsetVisited機能付きが問題であるか、それがnodeTableとしているのですか?私はこれを解決しようとするためにどこから始めるべきかさえ知らない。それはまったく同じオブジェクトであるので、それはそれを変更する変更、

def createNodeTable(network): 
    nodeTable = [] 
    for line in network: 
    nodeTable.append(Node) 
    return nodeTable 

:このコードで

答えて

4
nodeTable.append(Node) 

問題はその行にあります。あなたは何をしているのですかタイプ(またはクラス)をリストに追加することです。したがって、と全く同じタイプの参照の7回のリストで終わります。

代わりに、上記のタイプのインスタンスを作成する必要があります。あなたはそれを呼び出すことによってそれを行うことができます。

nodeTable.append(Node()) 
2

、あなたは、各反復で、まったく同じオブジェクト、クラスNodeを、追加しています。

一つは、新しいスタイルのクラス(これは、Python 2であると仮定した場合)に切り替えて、あなたはそれでいる間nodeTable.append(Node())

nodeTable.append(Node)を置き換えることを前提としています。

ところで、あなたはこれを行うことができます。

def createNodeTable(network): 
    return [Node() for line in network] 
2

should't

def createNodeTable(network): 
    nodeTable = [] 
    for line in network: 
     nodeTable.append(Node) 
    return nodeTable 

こと:

def createNodeTable(network): 
    nodeTable = [] 
    for line in network: 
     nodeTable.append(Node()) 
    return nodeTable 

あなたはnodeTableに追加7つの異なるインスタンスではなく、同じクラスのオブジェクトを7回欲しいです。

1

他の人が言っているように、おそらくNodeというインスタンスのリストを持つ方が理にかなっています。あなたが本当に別々のクラスのリストを持っていると思った場合、あなたはクラスファクトリを使用することができます。

def make_node_class(): 
    class Node: 
     previous = -1 
     distFromSrc = 1000000 
     visited = False 
    return Node 

node_table = [make_node_class() for line in network] 

node_tableの各要素は今、完全に独立したクラスであり、かつnode_table[0].visited = Trueを設定するnode_table[1].visitedの値には影響しません。しかし、これは非常に賢明な設計であるとは思われません。

関連する問題