Python DFS递归函数保留先前调用的值

时间:2019-01-07 01:20:53

标签: python recursion graph breadth-first-search dfs

很抱歉,标题误导了我,但我不能用其他任何方式来写。
我正在尝试实现bfs和dfs以便记住一些概念,但是递归版本的代码正在发生奇怪的行为。

正在发生的事情:

def rec_dfs(g, start_node, visited=[]):
    visited.append(start_node)
    for next_node in g[start_node]:
        if next_node not in visited:
            rec_dfs(g, next_node, visited)
    return visited

graph2={'A': ['B', 'C', 'D'],
       'B': ['A', 'E', 'F'],
       'C': ['A', 'F'],
       'D': ['A'],
       'E': ['B'],
       'F': ['B', 'C']}

rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D']               OK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A']          NOK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A', 'A']     NOK

它应该总是返回第一种情况,但是当我调查时,我发现第二个呼叫已经“访问过”。

如果我调用如下函数:

rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D']  OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D']  OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D']  OK

效果很好...
如果有人可以解释为什么发生这种现象,以及是否有避免这种现象的方法,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

您将visited数组用作可变的默认参数,根据http://code.activestate.com/recipes/577786-smarter-default-arguments/的定义,该参数实际上只初始化一次为空数组。

在随后的对rec_dfs()的每次调用期间,如果未明确初始化visited数组,则它将在每次后续的函数调用期间保持其状态。