2016-12-16 8 views
1

私はPythonで新しく、Dijkstraのアルゴリズムを作りたいと思います。リスト内のオブジェクトに追加すると、すべてのリストオブジェクトに追加されます。

私は頂点と辺のためのオブジェクトを持っている:

class Vertex: 
minDistance = float('inf') 
previousVertex = None 
edges = [] 
id = None 
name = None 

def __init__(self, id, name): 
    self.id = id 
    self.name = name 


class Edge: 
source = None 
target = None 
weight = None 

def __init__(self, source, target, weight): 
    self.source = source 
    self.target = target 
    self.weight = weight 

私は頂点を取り、彼の財産にエッジはそれで起動するすべてのエッジを追加します。私が持っているすべての頂点のためにこれを行う:私は最後の行に追加したときに

vertices = []  

def createGraph(self, vertices, edgesToVertices): 
    self.vertices = vertices[:] 
    for x in vertices: 
     for edge in edgesToVertices: 
      if edge.source is x.id: 
       x.edges.append(edge) 

問題があり、エッジは、リスト内のすべての頂点に追加されます。 誰かが私が間違っていることと理由を説明してもらえますか?

+0

等号をテストするには '==' not 'is'を使用してください。 –

+0

は 'class Edge:'の直下の3行を削除しますが、それがあなたの問題の原因だとは思っていません。デフォルトの属性を使用する場合は、 '__init__'のデフォルト引数として指定してください。 –

+0

' Vertex'と同じです。問題は、すべての頂点が1つのリストを 'エッジ'で共有しているということだと思います。 –

答えて

1

Vertexで定義したリストedgesは、クラス変数です。したがって、それを変更すると、すべてのVertexインスタンスに影響します(したがって、あなたが記述している動作)。あなたは何ができるか

は次のとおりです。

class Vertex: 
    def __init__(self, id, name): 
     self.id = id 
     self.name = name 
     self.edges = [] 
     self.previousVertex = None 
     self.minDistance = float('inf') 

class Edge: 
    def __init__(self, source, target, weight): 
     self.source = source 
     self.target = target 
     self.weight = weight 

この方法では、edgesは、各インスタンスに属します。

ところで、createGraph()Edgeの一部になると思っています。そうであれば、次のように実装することができます:

+0

Pythonオブジェクトがこのように働いているという考えはありませんでした。どうもありがとうございました! –