gpt4 book ai didi

python - 添加到列表中的对象最终会添加到所有列表对象

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:12 24 4
gpt4 key购买 nike

我是 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)

问题是当我在最后一行附加 时,边将添加到列表中的所有顶点。有人可以解释一下我做错了什么以及为什么吗?

最佳答案

您在 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 的一部分。如果是这种情况,您可以按如下方式实现:

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 - 添加到列表中的对象最终会添加到所有列表对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41190755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com