Python递归函数中局部变量未覆盖且返回None的原因分析
问题原因及修复方案
核心问题:递归调用未传递返回值
你的代码里,当用户输入非'y'触发递归调用confirm_board_size()时,没有返回这个递归调用的结果。这会导致:
- 内层递归实例如果最终输入'y'并返回了正确的棋盘尺寸,这个返回值无法传递到外层的函数调用
- 外层函数执行完递归调用后,没有后续的
return语句,Python会默认返回None
另外,前面while循环里的递归调用(except和else分支中的confirm_board_size())也存在同样问题:即使内层函数返回了合法值,外层函数也不会接收,会继续执行后续逻辑,引发混乱。
修复方案
方案1:修正递归调用的返回逻辑
在所有递归调用的地方添加return,确保内层函数的返回值能传递出去:
def confirm_board_size(): print() num = input("What size board would you like to play on? 3, 4, or 5: ") while num not in range(3, 6): try: num = int(num) except ValueError: print(f"{num} is not a valid input. Please enter 3, 4, or 5.") # 添加return传递递归结果 return confirm_board_size() else: if num not in range(3, 6): print(f"{num} is not a valid input. Please enter 3, 4, or 5.") # 添加return传递递归结果 return confirm_board_size() sample_board = Board(num) sample_board.create_board() sample_board.show_board() confirm = input("You will be playing on this board. Is that OK? ") confirm = confirm.lower() if confirm == 'y': return int(num) else: # 添加return传递递归结果 return confirm_board_size()
方案2:用循环替代递归(更推荐)
递归在这里属于不必要的用法,反而容易引发栈溢出和逻辑混乱,改用循环实现更直观可靠:
def confirm_board_size(): while True: print() # 获取棋盘尺寸输入 num_input = input("What size board would you like to play on? 3, 4, or 5: ") try: num = int(num_input) if num not in range(3, 6): print(f"{num} is not a valid input. Please enter 3, 4, or 5.") continue except ValueError: print(f"{num_input} is not a valid input. Please enter 3, 4, or 5.") continue # 展示棋盘并确认 sample_board = Board(num) sample_board.create_board() sample_board.show_board() confirm = input("You will be playing on this board. Is that OK? ").lower() if confirm == 'y': return num
内容的提问来源于stack exchange,提问作者Omace
相关产品推荐
相关产品推荐

