递归实现列表反转时退出rs函数后ans值异常变为'hello'的问题

问题原因
这是Python变量作用域+对象引用机制导致的必然结果,不存在异常:
- 你在递归函数
rs内部操作的ans是函数作用域内的参数变量,和函数外层定义的ans只是重名,本质是两个完全独立的变量 - 外层的
ans被你提前赋值为字符串'hello',而你没有在递归结束后把函数内部处理好的列表结果返回给外层,外层自然一直保留最开始的'hello'值 - 调试器显示函数内部
ans值正确,是因为调试时进入了函数内部作用域,看到的是函数自己的ans变量,退出函数回到外层作用域后,访问的自然是外层的ans


修复方案
递归实现列表反转不需要额外定义混淆作用域的同名变量,直接通过返回值传递递归结果即可,参考实现:
def rs(lst): # 递归终止条件:列表长度小于等于1时无需反转 if len(lst) <= 1: return lst # 递归反转子列表,拼接当前首元素到末尾 return rs(lst[1:]) + [lst[0]] # 外层变量直接接收递归函数的返回值,不要提前赋无关初始值 ans = rs([1,2,3,4,5]) print(ans) # 输出 [5,4,3,2,1]
如果确实需要在递归过程中维护结果变量,注意两个原则:
- 不要给外层接收结果的变量和函数内部参数起完全相同的名字,避免混淆
- 不要依赖函数内部对参数的修改自动同步到外层,必须通过
return把最终结果返回到外层作用域赋值。
内容的提问来源于stack exchange,提问作者coder1234
相关产品推荐
相关产品推荐

