Python如何在函数内遍历字典批量设置动态全局变量
问题描述
我有一个存储多组键值对的字典:
param_dict = { 'VAR1' : 'abcd', 'VAR2' : (1, 1), 'VAR3' : 10.0 }
我需要编写一个接收此类字典作为入参的函数,将字典内的每一组键值对设置为全局变量,其中字典键作为全局变量名,字典值作为对应变量的取值。
当前进展与遇到的问题
我已经实现了在函数外部从字典创建全局变量的逻辑,但在将代码封装为函数时遇到了问题。
函数外可正常运行的代码如下:
# Set defined values as global variables for k, v in param_dict.items(): exec(k + '=v')
运行上述代码后,可直接通过变量名访问对应全局变量:
print(VAR1) # Prints the value of the global variable VAR1
但将相同逻辑放入函数内部后,exec创建的是函数局部变量而非全局变量,无法在函数外部访问,运行会抛出NameError异常,对应测试代码如下:
def make_globals(param_dict): # Set defined values as global variables for k, v in param_dict.items(): exec(k + '=v') make_globals(param_dict=param_dict) print(VAR1) # Returns a NameError
我已知可以在函数内使用global关键字声明全局变量,但该方式需要在函数内硬编码全局变量名,无法适配我的场景:我的全局变量名是动态的,来自字典的键,需要循环遍历多组键值对批量生成全局变量。
解决方案
有两种可实现需求的方案,优先选择第一种,更简洁且无安全风险:
- 直接更新全局命名空间
Python的全局变量统一存储在globals()返回的字典对象中,直接将入参字典的键值对更新到该对象即可批量创建全局变量,完全不需要动态执行代码:
def make_globals(param_dict): globals().update(param_dict)
验证代码:
param_dict = { 'VAR1' : 'abcd', 'VAR2' : (1, 1), 'VAR3' : 10.0 } make_globals(param_dict) print(VAR1) # 输出 abcd print(VAR2) # 输出 (1, 1) print(VAR3) # 输出 10.0
注意:该操作会直接覆盖全局作用域中已存在的同名变量,使用前请确认字典的键不会和现有全局变量命名冲突。
- 调整exec执行上下文(不推荐)
如果必须使用exec实现,需要显式指定exec使用全局命名空间作为执行上下文,同时在执行语句中声明变量为全局作用域:
def make_globals(param_dict): for k, v in param_dict.items(): exec(f'global {k}; {k} = v', globals(), {'v': v})
该方案效果和第一种完全一致,但动态执行代码存在注入风险,如果字典内容来自不可信输入,可能被植入恶意执行逻辑,非必要场景不要使用。
内容的提问来源于stack exchange,提问作者Rory Majule
相关产品推荐
相关产品推荐

