python - 此生成器函数的意外行为
问题描述
设置:
我有以下生成器功能:
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
to的所有路径。t
ug
该图只是字典形式的邻接列表,其中每个和每个ug[v] = [w1, w2, ..., wn]
之间都有一条边v
wi
问题:
该功能有效。如果我对它进行一些迭代,s
它t
确实会生成从s
to 的所有路径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
退出它,这与在第一个循环中打印的路径相同。
另一方面,如果我没有中断,那么两个循环都会显示所有路径。
另一件奇怪的事情是,我在运行它的单元格中定义了生成器函数。如果我正在迭代生成器并且提前中断,则必须重新运行定义函数的单元格,然后才能在调用它的单元格中实际重置。
我不确定这里发生了什么。有人可以帮我理解为什么会这样吗?我怀疑它与生成器函数的结束有关,但我不确定。
解决方案
推荐阅读
- php - Codeigniter - 带循环的多输入
- docker - Docker 镜像文件位置
- c# - 数组问题和问题
- javascript - 在 React Native 中加载 ActivityIndicator 时如何禁用触摸屏?
- php - 我正在尝试使用 php、apache24(我已经安装了两个)服务器将我的数据库连接到 html,但我收到了这个错误:
- c# - C#:调用非静态成员函数而不创建对象
- angularjs-ng-repeat - 这是关于 AngularJS $data
- hyperledger-fabric - 如何在超级账本作曲家中保护参与者卡?
- google-cloud-stackdriver - Stackdriver 监控 - 指标缺失
- css - 显示链接部分的另一种样式