【问题标题】:strange result from yield from in pythonpython中yield的奇怪结果
【发布时间】:2016-01-22 07:56:10
【问题描述】:

我在 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']

【问题讨论】:

  • "但是如果我修改如下代码,输出很奇怪。" - “奇怪”不是有用的错误描述。请提供更多细节,可能包括实际的程序输出。
  • 产量可能达不到您的预期。你看过这个页面吗? stackoverflow.com/questions/231767/…

标签: python yield-from


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 2016-07-26
    • 1970-01-01
    • 2022-10-06
    • 2017-05-14
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多