繁体   English   中英

为什么 Python 生成器在 for 循环中更新时的行为不同?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM