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

Python递归问题:递归调用时sum变量为什么不会被0覆盖?

递归调用中局部变量sum不覆盖上层值的原因

核心原因和Python的变量作用域、函数调用栈机制有关:

  • 你在sum_of_list内部定义的sum是函数局部变量:每个独立的函数调用,都会在自己专属的栈帧空间里创建属于本次调用的局部变量,不同调用的同名变量是完全独立的实体,只是名字相同,存储在内存的不同位置,不会互相影响。
  • 递归调用时的栈运行逻辑:每次触发sum_of_list递归调用时,当前上层的函数栈帧会被完整保留在调用栈中,不会被修改。新触发的下层调用会单独压入新的栈帧,执行自己的sum=0初始化、遍历计算逻辑,运行结束后只会把返回值传递回上层,完全不会触碰上层栈帧里的sum变量。

我们可以用你给出的测试用例[1, 2, [3, 4], [5, 6]]具象化整个过程:

  1. 第一层调用(处理完整列表):sum初始化为0,累加1、2后sum=3,遇到子列表[3,4]触发递归
  2. 第二层调用(处理[3,4]):初始化自己的sum为0,累加3、4后sum=7,执行结束把7返回给上层
  3. 第一层调用拿到返回值7,加到自己的sum上得到3+7=10,继续遍历遇到下一个子列表[5,6]触发递归
  4. 第三层调用(处理[5,6]):初始化自己的sum为0,累加5、6后sum=11,执行结束把11返回给上层
  5. 第一层调用拿到返回值11,加到自己的sum上得到10+11=21,最终返回结果

如果你想验证变量的独立性,可以在sum = 0之后加一行打印代码:

print(f"当前处理列表为{a_list},sum的内存地址是{id(sum)}")

运行后会看到不同调用的sum内存地址完全不同,证明是互不干扰的独立变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:00