python中的嵌套列表在DFS递归期间返回空列表
我有一个graph dict,使用defaultdict表示python3中图形的邻接列表,并希望在此图形上执行DFS。 现在,问题是找到从起始字开始到结束字的所有路径,我正在为递归+回溯应用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[]
我已经制作了图表,并创建了两个新列表:路径[]和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()