屈服于...

Yield in for ... in

我遇到了这样的代码:

def func(tree):
 nodes = tree
 for node in nodes:
  yield node
  nodes += [42]

gen = func([-42, 3, 1, 4, 159])

for i in range(10):
 print(next(gen))

此代码是否有未定义的行为?

具体来说:

for node in nodes:
 yield node
 nodes += [42]

显示未定义的行为?

我知道:

for node in nodes:
 # yield node
 nodes += [42]

可能会导致意外行为,因为我们正在迭代的变量 (nodes) 正在 for 循环中更新。

不,为什么行为未定义?

生成器从树参数中生成所有原始元素,然后 42 到无穷大。

>>> gen = func([1, 2, 3])
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
42
>>> next(gen)
42
>>> next(gen)
42

[42] 扩展 nodes 确保生成器永远不会 运行 超出数量来产生。

唯一的问题是,如果您调用 next 的次数足够多,您将遇到 MemoryError,因为 nodes 变得太大了。