簡體   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