我很难理解eval()对于计算表达式中使用的全局变量的行为。
例如,以下脚本打印1

x = 1
print eval('x')

当以下脚本在NameError: name 'x' is not defined上失败时:
x = 1
print eval('x', {})

但是,来自the documentation of eval() for my Python version(强调我的):
expression参数作为一个python表达式(从技术上讲,是一个条件列表)进行解析和计算,使用globals和locals字典作为全局和本地名称空间。如果globals字典存在并且缺少'\uu内置'\uu',则在解析表达式之前,将当前globals复制到globals中。
因此,根据这一点,由于globals参数存在并且确实缺少__builtins__,我希望在计算表达式之前将所有当前的globals(包括x)复制到其中;但显然情况并非如此我错过了什么?

最佳答案

这似乎是个虫子不管是文档中的bug还是实现中的bug,我都不知道,但是如果不存在,那么eval不会将当前全局变量复制到globals中相反,it only copies __builtins__

if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
    if (PyDict_SetItemString(globals, "__builtins__",
                             PyEval_GetBuiltins()) != 0)
        return NULL;
}

我在Python bug tracker上找不到任何相关信息,而且3.4和当前开发分支中仍然存在差异,因此可能值得提交错误报告和建议的文档更正:
如果globals字典存在且缺少“__builtins__”,则在解析表达式之前,将当前的__builtins__复制到globals中。

关于python - 为什么在使用globals参数运行eval时为什么不复制globals?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24934908/

10-10 18:21