【问题标题】:using exec() with python 3.2在 python 3.2 中使用 exec()
【发布时间】:2011-04-14 01:15:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在这种情况下,“wsgi 应用程序内部”是什么意思?我有一个挥之不去的疑问,即您在这两种情况下运行的代码并不完全相同。
  • 添加了一个示例 wsgi 应用程序以清晰可见
  • Lennart 澄清说,这个问题与 wsgi 无关。

标签: python python-3.x


【解决方案1】:

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

【讨论】:

  • 可能值得注意的是,在 2.x 系列中,exec 本身就是一个语句而不是普通的内置函数,它实际上确实支持对函数内部本地命名空间的隐式修改。虽然这是一个坏主意,因为它会强制编译器关闭该特定函数内的优化局部变量访问功能。不管一开始这样做是否明智,如果将使用此类技巧的代码从 Python 2 移植到 Python 3,则可能会失败。
猜你喜欢
  • 2012-06-19
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2016-09-16
  • 2012-03-29
相关资源
最近更新 更多