在 Python 3.2 中使用 exec()

0 投票
1 回答
2363 浏览
提问于 2025-04-16 15:42

通常情况下,如果我用这段代码运行这些脚本:

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()

撰写回答