首页 > 技术文章 > Python--生成器表达式的嵌套 g = (n for n in ls if n in ls)

suguangti 2022-03-20 23:04 原文

我们知道,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 lsls就是最后的[0, 1, 2]

推荐阅读