You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用生成器表达式给列表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наđошƒаӽ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:40:19