Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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中的嵌套列表在DFS递归期间返回空列表_Python_List_Recursion_Python 3.6_Depth First Search - Fatal编程技术网

python中的嵌套列表在DFS递归期间返回空列表

python中的嵌套列表在DFS递归期间返回空列表,python,list,recursion,python-3.6,depth-first-search,Python,List,Recursion,Python 3.6,Depth First Search,我有一个graph dict,使用defaultdict表示python3中图形的邻接列表,并希望在此图形上执行DFS。 现在,问题是找到从起始字开始到结束字的所有路径,我正在为递归+回溯应用DFS 前 我的方法: 我已经制作了图表,并创建了两个新列表:路径[]和ans[]。 路径基本上是从beginWord开始,直到到达endWord,当它到达时,我将它附加到ans变量(现在它是一个二维嵌套列表),然后从列表中弹出最后一个单词以触发回溯。 我将继续这样做,直到所有路径都被探索并存储在ans[]

我有一个graph dict,使用defaultdict表示python3中图形的邻接列表,并希望在此图形上执行DFS。 现在,问题是找到从起始字开始到结束字的所有路径,我正在为递归+回溯应用DFS

我的方法:
我已经制作了图表,并创建了两个新列表:路径[]和ans[]。
路径基本上是从beginWord开始,直到到达endWord,当它到达时,我将它附加到ans变量(现在它是一个二维嵌套列表),然后从列表中弹出最后一个单词以触发回溯。 我将继续这样做,直到所有路径都被探索并存储在ans[]列表中

问题:
ans[]返回空列表,但它包含两个嵌套的空列表,这表明它知道答案是两个列表,这是真的,但为什么它会弹出这两个项目

我的代码:

def DFS(beginWord, endWord, graph, path, ans):

    path.append(beginWord)
    if beginWord == endWord:
        ans.append(path)
        path.pop()
        return

    for i in graph[beginWord]:
        DFS(i, endWord, graph, path, ans)

    path.pop()

注意:对ans[]使用extend而不是append有效(不完全有效,但我得到了路径),但为什么不使用append?

您只有一个列表
路径
。当您修改此列表时,您可以在它出现的任何地方修改它,包括将其推送到
ans
上的位置


相反,您需要类似于
ans.append(path.copy())
的东西,它在将路径附加到答案之前复制路径。您对
路径
所做的任何后续更改都不会影响您在
ans
上所做的更改

非常感谢@Frank Yellin的回答。如果我理解正确,那么ans(即2d列表)创建了对路径列表的引用,该路径列表已被修改,并反映在ans列表中?正确。推送到ans上的值和变量path的值都是Python中的单个值。所有引用都可以看到对列表所做的任何更改。您需要创建该值的副本,以便拥有一个“新”值,该值看起来与旧值一样,但没有链接到它。
[["hit","hot","dot","dog","cog"],
  ["hit","hot","lot","log","cog"]]
def DFS(beginWord, endWord, graph, path, ans):

    path.append(beginWord)
    if beginWord == endWord:
        ans.append(path)
        path.pop()
        return

    for i in graph[beginWord]:
        DFS(i, endWord, graph, path, ans)

    path.pop()