【问题标题】:exec() and variable scope [duplicate]exec() 和变量范围
【发布时间】:2017-08-06 18:32:12
【问题描述】:

我确定有人问过并回答过这个问题,但我找不到具体的:

我刚刚开始学习 Python,但我不了解 变量范围问题

我已将问题简化为:

案例一:

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 1Case 2 中实际存在于哪里?
  • 在没有global 声明的情况下,有没有办法在案例 1 中访问 aaa

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    来自docs

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

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

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

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

    【讨论】:

    • 问题是你实际上已经在全局范围内修改了'aaa',而不是在函数范围内。要验证,请将 'aaa = None' 放在 lev1() 的第一行
    • @ikamen:嗯,是的。我对这个分配给全局变量非常明确。您不能使用 exec 分配给函数的本地变量。
    • 谢谢。它对我有用:)
    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2013-05-26
    相关资源
    最近更新 更多