Python递归问题:递归调用时sum变量为什么不会被0覆盖?
递归调用中局部变量sum不覆盖上层值的原因
核心原因和Python的变量作用域、函数调用栈机制有关:
- 你在
sum_of_list内部定义的sum是函数局部变量:每个独立的函数调用,都会在自己专属的栈帧空间里创建属于本次调用的局部变量,不同调用的同名变量是完全独立的实体,只是名字相同,存储在内存的不同位置,不会互相影响。 - 递归调用时的栈运行逻辑:每次触发
sum_of_list递归调用时,当前上层的函数栈帧会被完整保留在调用栈中,不会被修改。新触发的下层调用会单独压入新的栈帧,执行自己的sum=0初始化、遍历计算逻辑,运行结束后只会把返回值传递回上层,完全不会触碰上层栈帧里的sum变量。
我们可以用你给出的测试用例[1, 2, [3, 4], [5, 6]]具象化整个过程:
- 第一层调用(处理完整列表):sum初始化为0,累加1、2后sum=3,遇到子列表
[3,4]触发递归 - 第二层调用(处理
[3,4]):初始化自己的sum为0,累加3、4后sum=7,执行结束把7返回给上层 - 第一层调用拿到返回值7,加到自己的sum上得到3+7=10,继续遍历遇到下一个子列表
[5,6]触发递归 - 第三层调用(处理
[5,6]):初始化自己的sum为0,累加5、6后sum=11,执行结束把11返回给上层 - 第一层调用拿到返回值11,加到自己的sum上得到10+11=21,最终返回结果
如果你想验证变量的独立性,可以在sum = 0之后加一行打印代码:
print(f"当前处理列表为{a_list},sum的内存地址是{id(sum)}")
运行后会看到不同调用的sum内存地址完全不同,证明是互不干扰的独立变量。
内容的提问来源于stack exchange,提问作者lukasz21
相关产品推荐
相关产品推荐

