添加到列表中的对象最终添加到所有列表对象
Adding to object in list ends up adding to all list objects
我是 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
我想取一个顶点并向他的 属性 edges 添加从它开始的每条边。对我拥有的每个顶点执行此操作:
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)
问题是当我在最后一行附加 时,边被添加到列表中的所有顶点。
谁能解释一下我做错了什么以及为什么?
您在 Vertex
中定义的列表 edges
是一个 class 变量。因此,如果您修改它,它会影响所有 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)
我是 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
我想取一个顶点并向他的 属性 edges 添加从它开始的每条边。对我拥有的每个顶点执行此操作:
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)
问题是当我在最后一行附加 时,边被添加到列表中的所有顶点。 谁能解释一下我做错了什么以及为什么?
您在 Vertex
中定义的列表 edges
是一个 class 变量。因此,如果您修改它,它会影响所有 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)