【发布时间】:2014-09-23 23:23:30
【问题描述】:
请注意:这不是关于如何更改函数体内的全局变量的问题。我了解global 关键字。
我的脚本有一堆全局配置变量。我想编写一个函数来隐藏本地命名空间中的一个全局变量(下面称为modified_procedure())并调用另一个引用配置变量的函数。即,
PARAMETER = 1
def procedure():
return PARAMETER * 3
def modified_procedure():
PARAMETER += 1
return procedure()
这会失败,因为PARAMETER 出现在modified_procedure() 的主体中,所以解释器认为它是一个局部变量,而不是在全局命名空间中查找它。我不想改变全局变量PARAMETER;我试图在modified_procedure() 的命名空间中隐藏它。
我能想到几个不方便的解决方案:
- OOPify 脚本,使配置变量成为对象属性,我可以使用新的
procedure()创建一个子类 - 使用
modified_procedure()中的global修改PARAMETER,然后在返回procedure()的结果之前恢复它
我可以通过跟踪PARAMETER 来做到这一点吗?如果有,怎么做?
【问题讨论】:
-
你可以试试
nonlocal而不是global。我会自己测试它,但我坚持使用非常旧的 Python 版本。 -
@TheSoundDefense 在你调用函数之前你会得到一个错误。遗憾的是,
nonlocal仅适用于非全局名称(即闭包)。 -
我认为 Python 2 中没有
nonlocal关键字。
标签: python python-2.7 scope shadowing