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

2024-09-30 14:28:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: nameselfnoneidsourcetargetinitdef
1条回答
网友
1楼 · 发布于 2024-09-30 14:28:54

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)

相关问题 更多 >