我正在尝试创建一个自定义的python解释器类型应用程序。我正在使用exec语句(在Python 2.7.6中)来执行给定的代码,但是全局变量并不像预期的那样工作。有人可以解释为什么这不起作用:
def print_x():
print(x)
g = {'x': 10, 'print_x': print_x}
l = {}
exec('print_x()', g, l)
结果(print_x函数是g还是l)是错误:
NameError: global name 'x' is not defined
那么,传递给exec的全局变量是否不会延续到被调用函数?
答案 0 :(得分:3)
函数内的x
从定义函数的命名空间的全局变量中获取。但是,您在其他名称空间中调用它。这与拥有多个模块并没有太大区别:
# foo.py
def print_x():
print(x)
然后尝试在不同的模块中使用它:
# bar.py
from foo import print_x
x = 10
print_x() # NameError
最终,g
是exec
执行上下文中的全局变量。在调用print_x
函数(在不同的全局上下文中定义)之后,您不能期望print_x
知道有关exec的执行上下文中的全局变量的任何内容 - { {1}}只知道其模块的上下文中的全局变量。