在列表理解中,对表达式进行热切评估。在生成器表达式中,仅根据需要查找它们。
因此,当生成器表达式遍历时
for c inall_configs,它引用
c[k]但仅
c在循环完成后查找,因此它仅对两个元组使用最新值。相比之下,列表推导会立即进行评估,因此它将创建第一个值为的
c元组和第二个值为的元组
c。
考虑这个小例子:
>>> r = range(3)>>> i = 0>>> a = [i for _ in r]>>> b = (i for _ in r)>>> i = 3>>> print(*a)0 0 0>>> print(*b)3 3 3
创建时
a,解释器立即创建该列表,
i并在对其求值后立即查找其值。创建时
b,解释器只是设置了该生成器,实际上并没有对其进行迭代并查找
i。这些
a已经作为完整列表存在于内存中,具有旧值
i,但是
b在那时进行了评估,当它查找的值时
i,便找到了新值。



