屈服于...
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
变得太大了。
我遇到了这样的代码:
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
变得太大了。