来自python中的yield的奇怪结果

时间:2015-10-22 21:33:34

标签: python yield-from

我在python中有一个深度优先搜索示例代码,如下所示。

def DFS_paths_recursive(self, start, end, path = None):
    if path == None:
        path = [start]
    if start == end:
        yield path
    else:
        unvisited = set(self._graph_dic[start]) - set(path)
        for vertex in unvisited:
            yield from self.DFS_paths_recursive(vertex, end, path+[vertex])

但如果我修改下面的代码,输出很奇怪。我所做的只是修改最后一行中递归调用之前的路径。问题是什么?

def DFS_paths_recursive(self, start, end, path = None):
    if path == None:
        path = [start]
    if start == end:
        yield path
    else:
        unvisited = set(self._graph_dic[start]) - set(path)
        for vertex in unvisited:
            path.append(vertex)
            yield from self.DFS_paths_recursive(vertex, end, path)

例如,对于图g = { "a" : ["d"], "b" : ["c"], "c" : ["b", "c", "d", "e"], "d" : ["a", "c", "e"], "e" : ["c"], "f" : ["g"], "g" : ["f"] } 有时候" a"之间路径的输出。和" e"是['a', 'd', 'c', 'b', 'e'],['a', 'd', 'c', 'b', 'e', 'e'],有时输出变为['a', 'd', 'e']

1 个答案:

答案 0 :(得分:0)

这与yield from无关。当您执行path.append(vertex)时,您会改变path的原始副本(这意味着您的调用者传递给您的版本以及您传递给递归调用的版本)。即使在函数内部,它的行为也不同,因为重复的append表示每个递归调用都处理所有相同的值,而不是固定的基数path加上一个附加值每个循环。

执行path+[vertex]正在创建新的list以传递给递归调用,防止突变影响您自己的path副本,并且只添加一个新的value每次递归调用的基础path,而不更改基础path