此生成器函数的意外行为

时间:2018-05-11 10:51:51

标签: python python-3.x

设置:

我有以下生成器功能:

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)

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

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

问题:

该功能有效。如果我针对某些st迭代它,它确实会生成从st的所有路径。然而,当我在一个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)

两个函数调用都针对相同的uv。但这是输出:

[ni, nj, nk]


[na, nb]

好像两个独立的函数调用是耦合的,当我突破第一个循环时,第二个也只输出1个路径!如果不是break',那么就会在第一个循环中打印出相同的路径。

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

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

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

0 个答案:

没有答案