Python通过函数参数修改全局变量触发语法错误如何解决?
报错原因
你遇到的语法报错本质是两个冲突点:
global关键字后只能跟全局变量的字面标识符,不能是函数参数这类本身就属于局部作用域的变量名,你同时把name声明为函数参数(局部作用域)和全局变量,解释器无法识别作用域- 你调用
foo(a3)时传递的是a3的值,不是变量本身的引用,就算没有语法报错,函数内部修改的也只是局部参数name的值,不会影响全局的a3
解决方案
方案1:使用globals()内置函数操作全局变量
globals()会返回当前全局作用域的变量字典,你可以把要修改的全局变量名以字符串形式传入函数,直接操作这个字典即可:
a1 = 0 a2 = 0 a3 = 0 a4 = 0 # 更多全局变量 def foo(var_name): if globals()[var_name] < 1: globals()[var_name] = 1 foo('a3') print(a3) # 输出1
方案2:封装全局状态(更推荐的规范写法)
零散定义大量全局变量本身容易导致作用域混乱,更推荐用字典或者类统一封装这些状态,不需要操作全局作用域就可以实现需求:
# 用字典封装所有状态 state = { 'a1': 0, 'a2': 0, 'a3': 0, 'a4': 0 } def foo(state, var_name): if state[var_name] < 1: state[var_name] = 1 foo(state, 'a3') print(state['a3']) # 输出1
内容的提问来源于stack exchange,提问作者tatsuya tanaka
相关产品推荐
相关产品推荐

