名称绑定如何与eval()一起使用?

时间:2014-07-24 14:49:51

标签: python eval

使用eval()时,我很难理解名称绑定是如何完成的。我正在使用Python 2.7.3。

例如,我定义了以下内容:

x = 1

def foo():
  return x

下面的代码段在丢失的x上崩溃,表示运行时名称绑定:

del x
print foo()

现在,自providing a global dictionary to eval() overrides all other globals except __builtins__以来,我还希望从下一行x发生此类崩溃:

print eval('foo()', {'foo': foo})

然而,该行运行良好并打印出1为什么会这样?

同样,为什么print eval('foo()', {'foo': foo, 'x': 2})打印1而不是2?

1 个答案:

答案 0 :(得分:2)

函数总是解析它们所定义的环境中的名称,而不是它们被调用的环境。当你将foo插入到eval调用的全局变量中时,它仍会在其中查找原始环境x的全局变量而不是新环境。这是允许你做的机制

from some_file import foo
foo()

foo使用some_file.x而非尝试访问当前范围“不存在x