[英]Generator stuck in an infinite loop inside a list comprehension?
这工作正常:
>>> def my_range(stop):
i = 0
while i < stop:
yield i
i += 1
>>> [k for k in my_range(10) if k < 5]
[0, 1, 2, 3, 4]
现在,我修改生成器:
>>> def my_range():
i = 0
while True:
yield i
i += 1
>>> result = []
>>> for k in my_range():
if k < 5:
result.append(k)
else:
break
>>> print(result)
[0, 1, 2, 3, 4]
现在,为什么将其陷入无限循环? 即使我的k <5。生成器是否应该仅在调用next时才进行迭代?
>>> [k for k in my_range() if k < 5]
LC中的条件返回false时并不表示break
。 如果您想要这种行为,请查看itertools
,特别是takewhile()
。
这个答案很好地说明了这一点:
请记住以下几点:
[ expression for item in list if conditional ]
等效于:
for item in list: if conditional: expression
这意味着您的列表理解:
[k for k in my_range() if k < 5]
等效于:
for k in my_range():
if k < 5:
k
现在应该弄清楚为什么它永远不会终止:没有什么可以真正break
无限循环的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.