使用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?
答案 0 :(得分:2)
函数总是解析它们所定义的环境中的名称,而不是它们被调用的环境。当你将foo
插入到eval
调用的全局变量中时,它仍会在其中查找原始环境x
的全局变量而不是新环境。这是允许你做的机制
from some_file import foo
foo()
并foo
使用some_file.x
而非尝试访问当前范围“不存在x
,