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

Python lambda递归实现列表反转的输出原理解析

递归Lambda反转列表执行逻辑详解

原代码如下:

m = [1, 2, 3, 4, 5]
d = lambda y: (d(y[1:]) + y[:1] if y else [])
print(d(m))
# 运行输出:[5, 4, 3, 2, 1]

核心逻辑拆解

这个lambda是用递归实现的列表反转函数,核心是三元判断逻辑:

  • 当传入的参数y是非空列表时,返回值为d(y[1:]) + y[:1]:先递归处理「去掉第一个元素的剩余子列表」,再把当前列表的第一个元素拼到递归结果的末尾
  • 当传入的参数y是空列表时,直接返回空列表[],这是递归终止条件,避免出现无限递归

这里用y[:1]而不是y[0]的原因:y[0]取到的是单个整数元素,无法和列表类型做拼接;y[:1]是切片操作,返回仅包含第一个元素的单元素列表,可以直接和列表做+运算。

完整执行流程

递归的执行规则是遇到嵌套调用就先计算最内层的调用结果,再逐层向外完成计算,整个过程分为「向下递归压栈」和「向上返回计算」两个阶段:

阶段1:向下递归,直到触发终止条件

  • 第1层(最外层调用):传入y = [1,2,3,4,5],列表非空,需要计算d([2,3,4,5]) + [1],暂时挂起当前计算,进入下一层求d([2,3,4,5])
  • 第2层调用:传入y = [2,3,4,5],列表非空,需要计算d([3,4,5]) + [2],挂起当前计算,进入下一层求d([3,4,5])
  • 第3层调用:传入y = [3,4,5],列表非空,需要计算d([4,5]) + [3],挂起当前计算,进入下一层求d([4,5])
  • 第4层调用:传入y = [4,5],列表非空,需要计算d([5]) + [4],挂起当前计算,进入下一层求d([5])
  • 第5层调用:传入y = [5],列表非空,需要计算d([]) + [5],挂起当前计算,进入下一层求d([])
  • 第6层(最内层):传入y = [],触发终止条件,直接返回[]

阶段2:向上返回,逐层计算结果

拿到最内层的返回值后,之前挂起的计算从内到外依次恢复执行:

  • 第5层拿到d([])的返回值[],计算得[] + [5] = [5],将[5]返回给第4层
  • 第4层拿到d([5])的返回值[5],计算得[5] + [4] = [5,4],将[5,4]返回给第3层
  • 第3层拿到d([4,5])的返回值[5,4],计算得[5,4] + [3] = [5,4,3],将[5,4,3]返回给第2层
  • 第2层拿到d([3,4,5])的返回值[5,4,3],计算得[5,4,3] + [2] = [5,4,3,2],将[5,4,3,2]返回给第1层
  • 第1层拿到d([2,3,4,5])的返回值[5,4,3,2],计算得[5,4,3,2] + [1] = [5,4,3,2,1],就是最终打印的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:33:10