使用exec()和python 3.2

时间:2011-04-14 01:15:55

标签: python python-3.x

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

x=5
exec("x+=1")
output=str(x)

如果我在python控制台中执行上述操作,则输出值为“6” 但如果它在函数内部运行,则exec不会更改x的值。

为什么会发生这种情况,我怎样才能在功能中获得与在控制台中相同的行为?

1 个答案:

答案 0 :(得分:7)

WSGI与它无关。您运行的测试不是运行相同甚至类似的代码。以下是您在非WSGI中创建的WSGI代码:

>>> def app():
...     x=5
...     exec("x+=1")
...     print(x)
... 
>>> app()
5

如您所见,它也不会改变x。这样做的代码是这样的:

>>> x=5
>>> exec("x+=1")
>>> print(x)
6

不同之处在于,在一种情况下,它是全局的,在另一种情况下是本地的。从documentation:“不应尝试修改默认的本地词典。”

您可以通过以下方式更改全局:

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