exec()和变量范围

时间:2017-08-06 18:32:13

标签: python python-3.x

我确信这已经被问到并得到了答复,但我没有具体找到它:

我只是选择了Python,我不理解变量范围问题

我已将问题简化为以下内容:

案例1:

def lev1():
   exec("aaa=123")
   print("lev1:",aaa)

lev1()

案例2:

def lev1():
   global aaa
   exec("aaa=123")
   print("lev1:",aaa)

lev1()

案例3:

def lev1():
   exec("global aaa ; aaa=123")
   print("lev1:",aaa)

lev1()
  • Case 1Case 2在print语句中未定义aaa
  • Case 3有效。 aaaCase 1中实际存在Case 2的位置?
  • 如果没有aaa声明,是否可以在案例1中访问global

1 个答案:

答案 0 :(得分:7)

来自docs

  

注意:默认的 locals 的行为与下面的函数locals()相同:对默认 locals 字典的修改不应该是尝试。如果您需要在函数exec()返回后查看代码对 locals 的影响,请传递一个显式的 locals 字典。

换句话说,如果你用一个参数调用exec,你就不应该尝试分配任何变量,而且Python不承诺如果你尝试会发生什么。

您可以通过明确传递execglobals()已分配的代码分配给全局变量。 (使用明确的globals dict且没有明确的locals dict,exec将对全局变量和本地变量使用相同的dict。)

def lev1():
   exec("aaa=123", globals())
   print("lev1:", aaa)

lev1()