为何递归获取数字输入时会触发‘local variable 'total' referenced before assignment’错误?
为什么会触发"local variable 'total' referenced before assignment"错误?
这问题我刚学递归的时候也踩过坑,咱们一步步捋清楚执行流程就懂了:
假设你操作是先输入s(触发错误),再输入5(成功):
- 第一次调用
get_total(),进入try块,输入s转int失败,触发except分支。 except里打印错误提示,然后递归调用get_total()——这时候相当于开启了一个全新的get_total()函数执行流程。- 新的
get_total()调用里,输入5转int成功,total被赋值为5,接着return total,把5返回给上一层的get_total()调用。 - 关键问题来了!上一层的
get_total()调用,在except里只是调用了get_total(),却没把这个递归返回的5存到任何变量里。当except执行完,程序会走到函数末尾的return total——但这个total在当前的函数作用域里完全没被定义过啊!第一次的try块里total没赋值成功,except里也没给total赋值,这不就触发“变量没定义就引用”的错误了嘛。
再看正确代码的逻辑:
它在except块里直接写了return get_total()——这意味着递归调用的返回值会直接作为当前函数的返回值“传递出去”,根本不会走到函数末尾的return total。而且每一次成功的调用,都会在try块里直接return total,保证每个函数调用都有明确的返回值,不会出现变量悬空的情况。
总结一下:错误代码的递归调用结果被“浪费”了,原函数的total始终没初始化;正确代码通过在except里直接返回递归结果,让返回值在调用链里正确传递,完美避开了未定义变量的问题。
内容的提问来源于stack exchange,提问作者SentimentalK
相关产品推荐
相关产品推荐

