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