设置:
我有以下生成器功能:
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
上生成从t
到ug
的所有路径。
图表只是一个字典形式的邻接列表,其中ug[v] = [w1, w2, ..., wn]
在v
和每个wi
之间有一条边
问题:
该功能有效。如果我针对某些s
和t
迭代它,它确实会生成从s
到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
',那么就会在第一个循环中打印出相同的路径。
另一方面,如果我没有破坏,那么两个循环都会显示所有路径。
另一件奇怪的事情是,我在运行它的单元格中定义了生成器函数。如果我在生成器上进行迭代并且我提前中断,我必须重新运行定义函数的单元格,然后才能在它被调用的单元格中实际重置。
我不确定这里发生了什么。有人能帮我理解为什么会这样吗?我怀疑它与生成器函数的结束有关,但我不确定。