[英]Why is the behavior of Python generators different when they're being updated in a for loop?
我在 Python 3.8 中使用以下代码:
a = range(10)
limits = (5, 3) # order of limits doesn't matter
a = (i for i in a if i > limit[0])
a = (i for i in a if i > limit[1])
print(list(a))
正如评论中所提到的,在这种情况下首先应用哪个限制并不重要; 无论是limits = (5, 3)
还是(3, 5)
,在这两种情况下[6, 7, 8, 9]
最后一行的输出都是[6, 7, 8, 9]
。 但是,对于(看似)无关紧要的代码重构,情况不再如此:
a = range(10)
limits = (5, 3) # order of limits matters now?
for limit in limits:
a = (i for i in a if i > limit)
print(list(a))
通过重构,如果limits = (3, 5)
,则结果输出为[6, 7, 8, 9]
,但对于limits = (5, 3)
,输出等于[4, 5, 6, 7, 8, 9]
。 在这种情况下,似乎只应用了最终过滤器; 当我运行以下代码时:
a = range(10)
limits = (4, 3, 2, 1, 0)
for limit in limits:
a = (i for i in a if i > limit)
print(list(a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
是输出。 有人可以解释为什么会发生这种行为吗?
在重构版本中,在生成器生成值时查找limit
变量的值,而不是在创建生成器对象时查找。
由于值生成只发生在list(a)
的最后一行,此时limit
的值是循环的最后一次迭代的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.