exec的Python变量范围?

exec的Python变量范围?,python,dynamic,exec,Python,Dynamic,Exec,下面是两段代码片段 我想复制f1的效果,其中外部变量x由内部函数g修改 但是,不是定义内部函数g,而是通过执行/解释字符串来获得g 代码: 在f1中,我得到[1]作为打印输出,但在f2中,我得到x未定义错误。我想知道如何在字符串定义的函数g中访问变量x 后续行动: 如果我想给g应用一个装饰器,会发生什么?假设我有一个超时修饰符,如果函数运行时间过长,该修饰符会导致函数失败: def f1(): x = [] @timeout(1) def g(): x.append(1)

下面是两段代码片段

我想复制f1的效果,其中外部变量x由内部函数g修改

但是,不是定义内部函数g,而是通过执行/解释字符串来获得g

代码:

在f1中,我得到[1]作为打印输出,但在f2中,我得到x未定义错误。我想知道如何在字符串定义的函数g中访问变量x

后续行动:

如果我想给g应用一个装饰器,会发生什么?假设我有一个超时修饰符,如果函数运行时间过长,该修饰符会导致函数失败:

def f1():
  x = []
  @timeout(1)
  def g():
    x.append(1)
  g() 
  print x
编辑:我设法解决它如下,因为超时不是在本地定义的,我必须将超时的定义从全局移动到本地,然后像往常一样继续

def f2():
  x = []
  strr = "@timeout(1)\ndef g():\n  x.append(1)\n"
  locals()['timeout'] = globals()['timeout']
  exec strr in locals()
  locals()["g"]()
  print x

您需要为exec添加名称空间。在locals中使用本地名称空间exec strr,它可以工作:

def f2():
    x = []
    strr = "def g():\n  x.append(1)\n"
    exec strr in locals()
    locals()["g"]()
    print x

>>> f2()
[1]
def f2():
    x = []
    strr = "def g():\n  x.append(1)\n"
    exec strr in locals()
    locals()["g"]()
    print x

>>> f2()
[1]