使用exec()和python 3.2

8st*_*ve8 0 python python-3.x

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

x=5
exec("x+=1")
output=str(x)
Run Code Online (Sandbox Code Playgroud)

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

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

Len*_*bro 7

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

>>> def app():
...     x=5
...     exec("x+=1")
...     print(x)
... 
>>> app()
5
Run Code Online (Sandbox Code Playgroud)

如你所见,它也没有改变x.这样做的代码是这样的:

>>> x=5
>>> exec("x+=1")
>>> print(x)
6
Run Code Online (Sandbox Code Playgroud)

不同之处在于,在一种情况下,它是全局的,在另一种情况下是本地的.从文档:"不应尝试修改默认的本地词典."

您可以通过执行以下操作来更改全局:

x=5
def app():
    exec("global x;x+=1")
    print(x)

app()
Run Code Online (Sandbox Code Playgroud)

您可以通过明确地更改本地:

def app():
    x=5
    d = {'x': x}
    exec("x+=1", d)
    x = d['x']
    print(x)

app()
Run Code Online (Sandbox Code Playgroud)

如果您有许多本地人需要访问,您可以使用d=locals().copy().

  • 值得明确注意的是,在2.x系列中,`exec`本身就是一个语句而不是普通的内置函数,它实际上*支持对函数内部本地命名空间的隐式修改.但这是一个坏主意,因为它迫使编译器关闭该特定函数内的优化局部变量访问功能.无论从一开始就做到这一点的智慧如何,如果从Python 2移植到Python 3,那么使用这样的技巧的代码可能会失败. (5认同)