Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 影响其他对象的对象列表';s列表_Python_List - Fatal编程技术网

Python 影响其他对象的对象列表';s列表

Python 影响其他对象的对象列表';s列表,python,list,Python,List,我正在尝试构建一个图,其中一个顶点有一个字符串标识符,如果两个顶点的字符串标识符仅相差一个字符,则该顶点连接到另一个顶点。例如,“dog”和“dot”可以通过边连接。我用一个邻接列表来维护这个图。但是,在我验证了两个顶点可以连接之后,我将把to_顶点对象附加到from_顶点对象的列表中,反之亦然。但这会导致列表中包含重复的对象。以下是代码(非常密集): 通过一些调试,我发现 if is_valid == True: v[i].edges.append(v[j]) v[j].edg

我正在尝试构建一个图,其中一个顶点有一个字符串标识符,如果两个顶点的字符串标识符仅相差一个字符,则该顶点连接到另一个顶点。例如,“dog”和“dot”可以通过边连接。我用一个邻接列表来维护这个图。但是,在我验证了两个顶点可以连接之后,我将把to_顶点对象附加到from_顶点对象的列表中,反之亦然。但这会导致列表中包含重复的对象。以下是代码(非常密集):

通过一些调试,我发现

if is_valid == True:
    v[i].edges.append(v[j])
    v[j].edges.append(v[i])

这是问题的根源,但我就是不能完全理解。这不像我在第一个append语句中修改to_顶点的edges字段,但第一个append语句也会影响它。

我不完全确定,但我认为问题在于使用默认值
[]
作为
的默认值,这(我认为)会创建一个唯一的对象
[]
,然后默认情况下初始化为该唯一对象。因此,所有边本质上都是同一个对象,当您附加到其中一条边时,您也会附加到所有其他边。这有意义吗

为了避免这个问题,不要使用默认的init,而是强制
self.edges=[]

或者,如果确实希望能够初始化任意边,请尝试以下操作:

def __init__(self, distance = -1, edges = None, name = ''):
    self.name = name
    self.distance = distance
    if edges is None:
        edges = []
    self.edges = edges

(让我知道这是否有效,因为我对此不确定…

另请参见:它有效!这意味着即使默认参数都引用同一个对象?我甚至懒得去看init函数。非常感谢!!!
if is_valid == True:
    v[i].edges.append(v[j])
    v[j].edges.append(v[i])
def __init__(self, distance = -1, edges = None, name = ''):
    self.name = name
    self.distance = distance
    if edges is None:
        edges = []
    self.edges = edges