Python:不使用global语句在函数内递增全局胜负变量的方法
问题解决:回合制游戏胜场计数不更新的问题
问题原因
你遇到的核心问题是Python中整数属于不可变类型,当你把p1_wins和p2_wins作为参数传入函数时,函数内部拿到的是这两个变量的副本。你在函数里对副本做的+=1操作,只会修改副本的值,完全不会影响外部的全局变量,所以外部的胜场计数始终不会更新。
解决方案
方案1:让函数返回更新后的胜场值
这是最直接的无全局变量方案,让函数处理完胜负判断后,返回更新后的p1_wins和p2_wins,然后在主循环中重新赋值给全局变量:
p1_wins = 0 p2_wins = 0 def judge_round(p1_wins, p2_wins, p1_answer, p2_answer): if p1_answer > p2_answer: print('Player 1 Won the Round') p1_wins += 1 elif p1_answer < p2_answer: print('Player 2 Won the Round') p2_wins += 1 # 平局的情况可以在这里补充处理 return p1_wins, p2_wins while True: # 先判断是否有人获胜,获胜后退出循环 if p1_wins == 3: print('Player 1 Wins the Game!') break if p2_wins == 3: print('Player 2 Wins the Game!') break # 注意:输入的内容是字符串,需要转成整数才能比较 p1_answer = int(input("Player 1 enter your number: ")) p2_answer = int(input("Player 2 enter your number: ")) # 接收函数返回的更新后的值 p1_wins, p2_wins = judge_round(p1_wins, p2_wins, p1_answer, p2_answer)
方案2:用类封装游戏状态(更推荐的工程化写法)
如果游戏后续有扩展需求,比如添加玩家名字、平局次数统计等,用类来封装状态和逻辑会更清晰,彻底告别全局变量:
class TurnBasedGame: def __init__(self): self.p1_wins = 0 self.p2_wins = 0 def judge_round(self, p1_answer, p2_answer): if p1_answer > p2_answer: print('Player 1 Won the Round') self.p1_wins += 1 elif p1_answer < p2_answer: print('Player 2 Won the Round') self.p2_wins += 1 def start_game(self): while True: if self.p1_wins == 3: print('Player 1 Wins the Game!') break if self.p2_wins == 3: print('Player 2 Wins the Game!') break p1_answer = int(input("Player 1 enter your number: ")) p2_answer = int(input("Player 2 enter your number: ")) self.judge_round(p1_answer, p2_answer) # 启动游戏 game = TurnBasedGame() game.start_game()
关于是否需要这个函数的疑问
非常有必要保留这个函数。把胜负判断的逻辑抽离成独立函数,有几个好处:
- 代码结构更清晰:主循环只负责流程控制(输入、胜负判定、退出),具体的回合胜负逻辑集中在一个地方
- 可维护性更强:以后如果要修改胜负规则(比如改成比较奇偶、或者加入道具加成),只需要修改
judge_round函数,不用动主循环的代码 - 可复用性:如果后续要添加多轮模式、或者其他需要判断胜负的场景,可以直接调用这个函数
内容的提问来源于stack exchange,提问作者JLizotte
相关产品推荐
相关产品推荐

