在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,使用类似技巧的代码可能会失败。