使用内部函数时,它将读取在外部函数中定义的变量。但是使用eval()时,它以某种方式失败。它似乎与locals()的工作方式有关...但是我不确定如何以及为什么...
def main():
aaa = 'print this'
def somethingelse():
print(locals())
#print(aaa)
print(eval('aaa'))
print(locals())
somethingelse()
main()
上述代码无法正常工作,并显示错误消息: 文件“”,第1行,位于 NameError:名称'aaa'未定义
但是,如果取消标记print(aaa)以便两个打印行都存在,则它们都将起作用。
我尝试在此print(aaa)命令之前和之后打印locals(),结果表明,如果标记了print(aaa)行,则两个locals()都为空{}。但是,如果未标记,则两个locals()都将是{aaa:'print this'}
这让我感到困惑...
答案 0 :(得分:2)
编译Python代码时,编译器必须做一些特殊的事情,以允许从嵌套函数内部访问局部变量。这会使对变量的所有访问变慢,因此仅对它知道在内部函数中使用的变量进行访问。内部函数的名称空间中根本不存在外部函数的其他局部变量。
它无法在用于eval
的字符串中进行分析,因此它不知道代码正在尝试访问内部函数中不存在的变量。您需要直接从内部函数内部访问变量,以便编译器将其添加到该函数的局部变量中。
您可能还是不想使用eval
,在极少数情况下,使用它是个好主意。