Python3函数中修改全局变量为何要声明global?有符合DRY原则的实现方案吗?
为什么修改全局变量前必须声明
global? Python的作用域规则默认:如果在函数内部对某个变量执行赋值操作,Python会默认将该变量识别为局部变量,不会匹配全局作用域的同名变量。如果未声明global就直接给全局变量赋值,运行时会抛出UnboundLocalError,因为Python会判定你正在使用一个尚未完成赋值的局部变量。
如果仅读取全局变量的值,不需要声明global,只有赋值/修改变量本身时才需要该声明,这是Python的刻意设计,目的是避免开发者在函数内误修改全局变量,减少隐式副作用带来的bug。
符合DRY原则的简洁实现方式
你不需要每次声明全局变量都单独写global关键字,Python支持在同一条global语句中声明多个全局变量,直接简化为以下写法即可:
def try_again(): play_again = input("would you like to play again? ").lower() if play_again == "y": # 一行声明多个全局变量,无需重复写global global comp_count, user_count comp_count = 0 user_count = 0 game() else: print(" Thanks for playing! Bye now! :) ") exit()
如果想要彻底避免使用global关键字,更推荐将计数封装到可变对象中(比如字典、类实例),修改可变对象的内部属性不需要声明global,示例如下:
# 全局定义存储计数的字典 count = { "comp": 0, "user": 0 } def try_again(): play_again = input("would you like to play again? ").lower() if play_again == "y": # 仅修改字典内部键值,没有对count变量本身赋值,不需要global声明 count["comp"] = 0 count["user"] = 0 game() else: print(" Thanks for playing! Bye now! :) ") exit()
这种方式比直接使用全局变量可维护性更强,后续新增计数项也不需要调整global声明内容。
内容的提问来源于stack exchange,提问作者Shadowheart411
相关产品推荐
相关产品推荐

