Python--生成器表示式的巢狀 g = (n for n in ls if n in ls)
阿新 • • 發佈:2022-03-21
我們知道,Python的生成式表示式是這樣的:
generator_1 = (i for i in range(10))
如果我將生成式表示式進行巢狀,然後再使用這個生成器的時候做點小動作:
ls = [1, 2, 3, 4, 5]
g = (n for n in ls if n in ls)
ls = [0, 1, 2]
result = list(g)
點選檢視結果
[1, 2]
結果解析:Python從2.4開始就對生成器巢狀做了一些規定,我們查詢 PEP 289 – Generator Expressions
有這麼一個規定:
Only the outermost for-expression is evaluated immediately, the other expressions are deferred until the generator is run:
g = (tgtexp for var1 in exp1 if exp2 for var2 in exp3 if exp4)
is equivalent to:
def __gen(bound_exp):
for var1 in bound_exp:
if exp2:
for var2 in exp3:
if exp4:
yield tgtexp
g = __gen(iter(exp1))
del __gen
也就是說:
只有最外層的forloop迴圈才會在生成生成器的時候就立即計算,而其他的只會在生成器執行時候再計算執行
所以結果就很明顯了,g = (n for n in ls if n in ls)
中for n in ls
在生成器產生時候就會計算執行,此時ls = [1, 2, 3, 4, 5]
而最後在使用這個生成器g的時候,ls = [0, 1, 2]
,後面的if n in ls
的ls
就是最後的[0, 1, 2]
了