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

Python中递归在for循环外正常,但循环内触发递归深度超限错误

循环中Lambda触发递归错误的原因

手动添加Lambda的正常情况

def f(x):
    return x

sol = [f]
sol.append(lambda x: sol[0](x) + x)
sol.append(lambda x: sol[1](x) + x)

print(sol[0](1), sol[1](1), sol[2](1))
# 输出:1 2 3

手动添加时,每个Lambda明确指定了要调用的sol列表索引,定义时就确定了依赖的函数,调用时能按预期执行。


循环添加Lambda的错误情况

def f(x):
    return x

sol = [f]
for i in range(1, 3):
    sol.append(lambda x: sol[i](x) + x)

print(sol[0](1), sol[1](1), sol[2](1))
# 报错:RecursionError: maximum recursion depth exceeded.

错误原因

核心问题是Lambda对变量i的引用是延迟绑定:Lambda定义时不会立即捕获i的当前值,只有当它被调用时,才会去查找i的最新值。

具体过程:

  1. 循环执行两次,i依次取1、2,每次添加的Lambda都引用sol[i]。
  2. 循环结束后,变量i的最终值是2(因为range(1,3)遍历完最后一个值是2)。
  3. 当调用sol[1](1)或sol[2](1)时,Lambda会读取i的当前值2,于是都会调用sol[2](x)——而sol[2]本身就是这个Lambda,直接陷入无限递归,最终触发递归深度超限错误。

解决方法

通过给Lambda添加默认参数,在定义时就把i的当前值绑定进去,避免延迟绑定的问题:

def f(x):
    return x

sol = [f]
for i in range(1, 3):
    # 用默认参数i=i,将循环当前的i值固定到Lambda内部
    sol.append(lambda x, i=i: sol[i](x) + x)

print(sol[0](1), sol[1](1), sol[2](1))
# 输出:1 2 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:13:19