【发布时间】:2019-01-31 09:16:24
【问题描述】:
>>> def fn(sc):
... exec(sc)
这个函数运行得很好。
【问题讨论】:
-
答案还是一样:要么添加
global语句,明确引用globals()['A4'] = A4 + 1,要么告诉exec()要更新哪个本地命名空间。
标签: python-3.x
>>> def fn(sc):
... exec(sc)
这个函数运行得很好。
【问题讨论】:
global语句,明确引用globals()['A4'] = A4 + 1,要么告诉exec()要更新哪个本地命名空间。
标签: python-3.x
我认为在 fn 内执行 "A4 = A4+1" 而不指出 A4 是全局变量不会影响全局变量,因为每个函数都有自己的局部变量字典。
如果您需要 fn 成为包含 exec 调用的单独函数,您可以使用 global 关键字指定您的变量是全局变量。
>>> def fn(sc):
... exec(sc)
...
>>> value = 1
>>> fn('value += 1')
>>> value
1
>>> fn('global value; value += 1')
>>> value
2
或者,exec 将接受明确的 globals 和 locals 字典传递给它。这些函数的帮助信息指出,您无法通过更新locals() 可靠地更改变量的值,但您可以使用globals()。只要您要更新全局变量,就不需要传递locals()。
>>> def fn(sc):
... exec(sc, globals())
...
>>> value = 1
>>> fn('value += 1')
>>> value
2
【讨论】:
exec()。显然fn 不仅仅是一个别名,因为命名空间目标是不同的。
locals() 和globals() 返回相同的东西。只要您只想更改全局变量,将globals() 作为两个字典都应该可以工作。