关于函数中return的作用、返回对象及递归场景下返回值异常的技术问询
解惑:Python中return的作用、返回对象,以及递归代码返回None的原因
嘿,我来帮你理清这个问题——你对return的作用和递归中的返回逻辑有疑问,特别是为什么你的代码会输出None而不是预期的15,咱们一步步拆解:
一、return的核心作用与返回对象
首先纠正一个误区:return不会把值返回给函数本身,它的核心作用有两个:
- 立即终止当前函数的执行流程;
- 将指定的值传递回调用这个函数的上下文——这个上下文可以是另一个函数(比如递归中的上层调用),也可以是全局作用域的代码(比如你直接在主程序里调用函数并打印结果)。
简单说:谁调用了这个函数,return就把值给谁。
二、你的递归代码为什么输出None?
先看你给出的代码:
def print_sum(i, n, sum): if i==n: sum += n print(sum) return sum else: sum += i print_sum(i+1,n,sum) # print(i) print(print_sum(1,5,0))
问题出在else分支的递归调用没有return结果:
当i=5时,进入if分支,sum变成15,打印15后return 15——这个return是返回给调用它的print_sum(4,5,10)(也就是i=4时的函数调用)。但在i=4的else分支里,你只调用了print_sum(5,5,10),却没有把这个调用的返回值再return出去。
这就导致:
print_sum(4,5,10)执行完else分支后,没有返回任何值,Python默认会返回None;- 这个
None又会返回给调用它的print_sum(3,5,6),以此类推; - 最终最开始的
print_sum(1,5,0)也返回None,所以print(print_sum(1,5,0))输出的就是None。
三、修正后的代码
只需要在else分支里把递归调用的结果return出去,让返回值沿着调用栈逐层向上传递:
def print_sum(i, n, sum): if i==n: sum += n print(sum) return sum else: sum += i return print_sum(i+1,n,sum) # 新增return,传递下层返回值 print(print_sum(1,5,0))
修改后,每一层递归都会把下层返回的sum值传递回上层,最终最开始的调用会拿到15,打印出来就是预期的结果。
四、关于递归栈的补充
你提到的“值会沿着栈向下输出”其实应该是沿着调用栈向上传递:递归调用时,函数会被依次压入调用栈;当触发base case(这里的i==n)并return时,返回值会从栈顶(最内层的递归函数)逐层传递回栈底(最初的调用)——前提是每一层都要把下层的返回值return出去,否则传递链会断裂,返回None。
内容的提问来源于stack exchange,提问作者ray_milan
相关产品推荐
相关产品推荐

