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的最新值。
具体过程:
- 循环执行两次,
i依次取1、2,每次添加的Lambda都引用sol[i]。 - 循环结束后,变量
i的最终值是2(因为range(1,3)遍历完最后一个值是2)。 - 当调用
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'
相关产品推荐
相关产品推荐

