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

Python的list.extend()是否保证逐个处理传入可迭代对象的元素?

问题背景

我曾经写过一行Python代码实现阶乘计算,代码如下:

factorial = [n:=(1 if i==0 else n*i) for i in range(10)]

之后我又构思了一个两行版本的阶乘实现:

factorial = [1]
factorial.extend(factorial[-1]*i for i in range(1, 10))

这段代码在Python 3.8解释器中可正常运行,但该实现显然依赖list.extend()逐个追加元素的行为:如果list.extend()后续改为批量追加元素的实现逻辑,这段代码将失效。我想确认是否有官方规范对list.extend()的这一行为作出明确规定。

解答

这个行为有明确的官方规范约束,完全不用担心后续版本改动导致代码失效。

  • 按照Python内置类型的明确规范,list.extend()接收任意可迭代对象作为入参时,必须严格遵循迭代顺序逐个消费元素,每取出一个元素就立刻追加到当前列表末尾,不存在“先批量读完所有待追加元素、再一次性写入列表”的合法实现可能。
  • 你写的两行阶乘代码能正常运行,刚好利用了两个确定的语言特性:一是传入extend的生成器本身是惰性求值的,每触发一次迭代才会计算一次factorial[-1]*i的值;二是extend逐元素追加的逻辑,保证上一轮算出的阶乘值已经写入列表,下一轮迭代取factorial[-1]时拿到的永远是上一阶的正确结果。
  • 实际上不止list.extend(),Python所有内置可变序列的就地扩展操作(比如列表的+=运算,底层就是调用extend逻辑)都遵循这个逐元素追加的规则。这个行为从Python上线extend方法开始就一直保持一致,属于被海量存量生产代码依赖的核心行为,官方不可能做这种破坏性调整,否则会直接导致无数现有代码运行崩溃。
  • 顺带提一句你写的海象运算符一行版阶乘实现,也是完全符合规范的:列表推导式本身就是按迭代轮次逐次执行,海象运算符:=绑定的变量n会在每轮迭代中更新为最新的阶乘值,同样可以稳定得到0-9的阶乘结果。

内容的提问来源于stack exchange,提问作者cyc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:06:21