首页 > 解决方案 > 此生成器函数的意外行为

问题描述

设置:

我有以下生成器功能:

def get_paths(ug, s, t, path=[], visited=set([])):
    if s == t: yield path

    visited.add(s)
    for n in ug[s]:
        if n in visited: continue
        yield from get_paths(ug, n, t, path + [n], visited)
    visited.remove(s)

它在无向图上生成从sto的所有路径。tug

该图只是字典形式的邻接列表,其中每个和每个ug[v] = [w1, w2, ..., wn]之间都有一条边vwi

问题:

该功能有效。如果我对它进行一些迭代,st确实会生成从sto 的所有路径t。但是,当我在 jupyter 笔记本单元格中执行以下操作时,发生了一些奇怪的事情:

for path in get_paths(udgraph, u, v):
    p = [n for n in path]
    print(p)
    break

print("\n")

for path in get_paths(udgraph, u, v):
    q = [n for n in path]
    print(q)

两个函数调用都是针对同一个u, 和v. 但这是输出:

[ni, nj, nk]


[na, nb]

好像两个单独的函数调用是耦合的,当我跳出第一个循环时,第二个循环也只输出 1 条路径!如果我没有break退出它,这与在第一个循环中打印的路径相同。

另一方面,如果我没有中断,那么两个循环都会显示所有路径。

另一件奇怪的事情是,我在运行它的单元格中定义了生成器函数。如果我正在迭代生成器并且提前中断,则必须重新运行定义函数的单元格,然后才能在调用它的单元格中实际重置。

我不确定这里发生了什么。有人可以帮我理解为什么会这样吗?我怀疑它与生成器函数的结束有关,但我不确定。

标签: pythonpython-3.x

解决方案


推荐阅读