在 Python 3.2 中使用 exec()
通常情况下,如果我用这段代码运行这些脚本:
x=5
exec("x+=1")
output=str(x)
如果我在Python控制台执行上面的代码,输出的结果是“6”。但是如果在一个函数里面运行,exec却没有改变x的值。
为什么会出现这种情况呢?我该怎么做才能在函数里面也得到和控制台一样的结果呢?
1 个回答
7
WSGI和这个问题没有关系。你测试的代码和实际运行的代码并不相同,甚至可以说完全不一样。这里是你的WSGI代码转换成非WSGI的版本:
>>> def app():
... x=5
... exec("x+=1")
... print(x)
...
>>> app()
5
如你所见,这段代码也没有改变 x
的值。真正改变它的代码是这段:
>>> x=5
>>> exec("x+=1")
>>> print(x)
6
两者的区别在于,一个是全局的,另一个是局部的。根据文档的说明:“不应该尝试修改默认的局部字典。”
你可以通过以下方式来改变全局变量:
x=5
def app():
exec("global x;x+=1")
print(x)
app()
而要改变局部变量,你需要明确地这样做:
def app():
x=5
d = {'x': x}
exec("x+=1", d)
x = d['x']
print(x)
app()
如果你有很多局部变量需要访问,可以使用 d=locals().copy()
。