Python3中返回旧变量值的异常行为原因咨询
问题分析:递归调用未正确返回导致的返回值异常
问题场景
执行代码时,第一次输入aaa,程序提示"enter positive digits only",再次输入12后,函数输出了和12相关的内容,但最终返回的却是旧值aaa,引发ValueError: could not convert string to float: 'aaa'异常。
原代码
import math def inputValueCheck(): x = input("Enter x: ") print('1 ',x) number = True #please ignore if x.isnumeric() is False: print('enter positive digits only') inputValueCheck() elif x.isnumeric() is True and int(x) < 0: print('enter positive digits only') inputValueCheck() else: print('2 ',x) #return x print('3 ',x) return x x = float(inputValueCheck()) y = math.sqrt(x) print("The square root of", x, "equals to", y)
原因解析
问题核心在于递归调用时没有返回递归函数的结果:
- 第一次调用
inputValueCheck(),输入aaa,触发第一个if分支,调用inputValueCheck()(这是第二次调用)。 - 第二次调用输入
12,符合else分支条件,执行print('2 ',x),接着执行print('3 ',x),然后返回12。但这个返回值没有被第一次调用的函数接收。 - 第一次调用的函数会继续执行自己的
print('3 ',x)(这里的x还是第一次输入的aaa),最后返回aaa给主程序。 - 主程序尝试把
aaa转成float,自然抛出异常。
另外还有个小问题:x.isnumeric()对负数(比如"-12")会返回False,所以第二个elif分支永远不会被触发——输入负数时第一个if分支就会拦截。
修正方案
方案1:修复递归调用的返回逻辑
在递归调用处加上return,把递归的结果传递回上层调用:
import math def inputValueCheck(): x = input("Enter x: ") print('1 ',x) if not x.isnumeric(): print('enter positive digits only') return inputValueCheck() # 新增return,传递递归结果 elif int(x) < 0: print('enter positive digits only') return inputValueCheck() # 新增return else: print('2 ',x) print('3 ',x) return x x = float(inputValueCheck()) y = math.sqrt(x) print("The square root of", x, "equals to", y)
方案2:改用while循环(更推荐)
递归虽然能实现循环输入,但如果用户多次输入错误,可能触发递归深度限制。用while循环更稳妥,同时可以优化输入判断逻辑(支持负数输入提示):
import math def inputValueCheck(): while True: x = input("Enter x: ") print('1 ',x) try: num = float(x) if num >= 0: print('2 ',x) print('3 ',x) return x else: print('enter positive digits only') except ValueError: print('enter positive digits only') x = float(inputValueCheck()) y = math.sqrt(x) print("The square root of", x, "equals to", y)
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

