为何使用生成器表达式给列表extend会引发无限循环?
生成器表达式传入extend导致无限循环的原因分析
请看以下代码:
a = [1, 2] a.extend(x*2 for x in a) print(a)
初学者乍看可能认为代码会输出:
[1, 2, 2, 4]
但实际运行时程序会陷入无限循环无法终止。正确的做法是先将生成器表达式转为列表,示例如下:
a = [1, 2] a.extend([x*2 for x in a]) print(a)
为什么第一种写法会无限循环?
你的预期执行逻辑错在对生成器表达式和extend执行机制的理解:
- 生成器表达式是惰性求值的,它不会提前计算出所有结果,而是在迭代过程中逐个生成值
- 当
extend接收生成器作为参数时,不会先把生成器转成完整序列,而是直接开始迭代生成器:每从生成器里取出一个值,就立刻把这个值添加到原列表a中 - 生成器的迭代对象就是原列表
a,随着extend不断往a里加元素,生成器会持续迭代这些新添加的元素,计算出x*2后再添加到a,循环永远不会停止
而列表推导式[x*2 for x in a]是立即求值的,会一次性基于当时的a生成完整的新列表,再把这个固定长度的列表传给extend,此时a的修改不会影响已经生成的列表,因此能得到预期结果。
内容的提问来源于stack exchange,提问作者Sнаđошƒаӽ
相关产品推荐
相关产品推荐

