2016-12-16 2 views
1

Я новичок в Python, и я хочу сделать алгоритм Дейкстры, и у меня возникла проблема в самом начале.Добавление к объекту в списке заканчивается добавлением ко всем объектам списка

У меня есть объекты для вершин и ребер:

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:'. Если вы хотите иметь атрибуты по умолчанию, используйте их как аргументы по умолчанию для '__init__' –

+0

То же самое для' Vertex'. Я думаю, проблема в том, что все ваши вершины имеют один список «edge» –

ответ

1

Список, edges, который вы определили в Vertex, является переменной класса. Таким образом, если вы его изменяете, это влияет на все экземпляры 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. Если это так, вы можете реализовать его следующим образом:

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

    def createGraph(self, vertices, edgesToVertices): 
     for vertex in vertices: 
      for edge in edgesToVertices: 
       if edge.source is vertex.id: 
        vertex.edges.append(edge) 
+0

Хорошо, я вижу это сейчас. Если бы идеи Python не работали так. Большое спасибо! –

Смежные вопросы