Python循环变量重置问题:如何保留计数器与列表值?
解决Belote计数器循环中变量重置的问题
嘿,我完全懂你遇到的坑——每次调用begin()函数时,函数里的r、we_list和you_list都会被重新初始化,之前循环积累的得分和轮次自然就没了。这是因为这些变量是函数内部的局部变量,每次调用函数都会从头创建它们,根本不会保留上一次的值。
下面给你两个适合新手理解的解决方案,都是能快速解决问题的:
方案1:把变量放在函数外面(最直观)
把需要保留的变量移到函数外部,让函数接收这些变量作为参数,处理完后返回更新后的版本。这样每次循环时,我们就能把上一轮的结果传递给下一次函数调用,数据就不会丢了。
修改后的代码示例:
def update_round(current_r, our_scores, your_scores): print("This is a counter for the game Belote") print(f"Round {current_r}") # 输入本轮得分 we = int(input("Enter score for 'We': ")) our_scores.append(we) we_sum = sum(our_scores) you = int(input("Enter score for 'You': ")) your_scores.append(you) you_sum = sum(your_scores) # 打印当前总分 print(f"Total for 'We': {we_sum}") print(f"Total for 'You': {you_sum}") # 返回更新后的轮次和列表,供下一轮使用 return current_r + 1, our_scores, your_scores # 初始化变量(只执行一次,在循环外面) current_round = 1 our_scores = [] your_scores = [] # 循环运行,直到用户想退出 while True: current_round, our_scores, your_scores = update_round(current_round, our_scores, your_scores) # 询问是否继续下一轮 keep_going = input("Start next round? (y/n): ").lower() if keep_going != 'y': print("Game ended!") break
方案2:用嵌套函数保留状态(稍微进阶)
如果你想把变量封装在逻辑内部,可以用nonlocal关键字让内层函数访问外层函数的变量,这样变量只会初始化一次,每次调用内层函数都会更新它而不是重置。
示例代码:
def belote_counter(): # 这些变量只在第一次调用belote_counter时初始化 round_num = 1 we_scores = [] you_scores = [] def run_next_round(): nonlocal round_num, we_scores, you_scores # 告诉函数:这些变量来自外层函数 print("This is a counter for the game Belote") print(f"Round {round_num}") we = int(input("Enter score for 'We': ")) we_scores.append(we) print(f"Total 'We': {sum(we_scores)}") you = int(input("Enter score for 'You': ")) you_scores.append(you) print(f"Total 'You': {sum(you_scores)}") round_num += 1 # 更新轮次 # 循环运行 while True: run_next_round() continue_game = input("Next round? (y/n): ").lower() if continue_game != 'y': break # 启动计数器 belote_counter()
核心逻辑就是:需要保留状态的变量,绝对不能每次循环都重新定义。要么把它们放在循环/函数外面,要么用语法让函数记住之前的状态。你可以先试试方案1,它更直白,容易理解,适合刚学编程的你。
内容的提问来源于stack exchange,提问作者Kaloian Kozlev
相关产品推荐
相关产品推荐

