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
相关产品推荐
相关产品推荐

