如何移除代码中的全局变量?以全局points变量为例寻求解决方案
如何移除全局变量points?
嘿,我太懂你被全局变量points缠了一周的烦躁了——全局变量不仅让代码耦合度变高,后续维护起来也容易踩坑。咱们直接上两种可行的方案,帮你把它彻底换掉!
方案一:参数传递+返回值(小项目首选,改动量小)
你的代码流程是init() → choice() → play_game() → guessing_capital(),points在guessing_capital()里首次被使用,直到数值达到5。那我们可以把points作为参数在函数间传递,修改后再返回更新的值,完全不需要全局变量:
- 首先修改
init(),去掉global声明,直接初始化points,然后把它和其他状态一起传给choice():
def init(): points = 0 hidden_password = [] hidden_password2 = [] country = "" used = [] start_time = datetime.now() welcome() # 把所有需要的状态都作为参数传递给choice choice(points, hidden_password, hidden_password2, country, used, start_time)
- 接着更新
choice(),接收参数后,把points传递给play_game():
def choice(points, hidden_password, hidden_password2, country, used, start_time): # 保留你原本的用户选择逻辑 # 当需要进入游戏时,把points等参数传给play_game play_game(points, hidden_password, hidden_password2, country, used, start_time)
- 然后是
play_game(),接收points,调用guessing_capital()时传递它,并且接收返回的更新后的值:
def play_game(points, hidden_password, hidden_password2, country, used, start_time): # 你的原有游戏准备逻辑 # 调用guessing_capital并接收更新后的points points = guessing_capital(points, hidden_password, hidden_password2, country, used, start_time) # 如果后续还有需要用到points的逻辑,继续传递这个更新后的值
- 最后修改核心的
guessing_capital(),接收points参数,修改后返回它:
def guessing_capital(points, hidden_password, hidden_password2, country, used, start_time): # 这里是你原本使用points的逻辑,比如: while points < 5: # 用户猜对后的操作 points += 1 # 其他游戏逻辑... # 返回更新后的points,让上层函数可以继续使用 return points
方案二:类封装状态(适合功能扩展的项目,结构更清晰)
如果你的游戏后续可能会加更多功能,把所有游戏状态封装成一个类会更合理——所有变量都是类的属性,函数作为类的方法,完全不用全局变量:
import datetime class CapitalGame: def __init__(self): # 把原来的全局变量都变成类的实例属性 self.points = 0 self.hidden_password = [] self.hidden_password2 = [] self.country = "" self.used = [] self.start_time = datetime.datetime.now() self.welcome() self.choice() def welcome(self): # 原来的welcome逻辑,直接用self访问属性即可 print("欢迎来到猜首都游戏!") def choice(self): # 原有的用户选择逻辑,调用play_game直接用self.play_game() print("开始游戏!") self.play_game() def play_game(self): # 原有的游戏准备逻辑 self.guessing_capital() def guessing_capital(self): # 直接操作self.points,不需要传参 while self.points < 5: print(f"当前分数:{self.points}") # 模拟猜对操作 self.points += 1 print(f"恭喜!你达到了5分!") # 启动游戏 if __name__ == "__main__": CapitalGame()
这样所有状态都集中在类里,代码结构更清晰,后续加新功能也更容易维护。
两种方案都能完美解决你的问题,要是项目小、不想改太多代码,选方案一;要是打算扩展功能,方案二更合适。
内容的提问来源于stack exchange,提问作者Kaspazza
相关产品推荐
相关产品推荐

