在python 3.2中使用exec()

在python 3.2中使用exec(),python,python-3.x,Python,Python 3.x,因此,如果我使用以下代码运行这些脚本: x=5 exec("x+=1") output=str(x) 如果在python控制台中执行上述操作,则输出值为“6” 但是如果它在函数中运行,exec不会更改x的值 为什么会发生这种情况?我如何在函数中获得与控制台中相同的行为?WSGI与此无关。有效的测试运行的代码不相同,甚至不相似。以下是制作成非WSGI的WSGI代码: >>> def app(): ... x=5 ... exec("x+=1") ...

因此,如果我使用以下代码运行这些脚本:

x=5
exec("x+=1")
output=str(x)
如果在python控制台中执行上述操作,则输出值为“6” 但是如果它在函数中运行,exec不会更改x的值


为什么会发生这种情况?我如何在函数中获得与控制台中相同的行为?

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

在这种情况下,“在wsgi应用程序中”是什么意思?我一直怀疑您在这两种情况下运行的代码是否完全相同。添加了一个示例wsgi应用程序,使其非常清晰正如Lennart澄清的那样,这个问题与wsgi无关。可能值得明确指出的是,在2.x系列中,
exec
本身就是一个语句,而不是一个普通的内置函数,它实际上支持对函数内部的本地名称空间进行隐式修改。这是一个坏主意,因为它迫使编译器关闭特定函数中的优化局部变量访问功能。不管一开始这样做是否明智,如果将代码从Python2移植到Python3,使用类似技巧的代码可能会失败。