Python 使用dictionary comprehension和eval()创建dict时会出现NameError

Python 使用dictionary comprehension和eval()创建dict时会出现NameError,python,dictionary,dictionary-comprehension,Python,Dictionary,Dictionary Comprehension,我正试图通过以下方式创建一个包含字典理解的字典(这是更大代码的一部分) 第一个print完全按照预期打印(变量zeta的值),第二个print确认zeta在本地词典中,但在词典理解命令中,python会因此错误而失败 NameError: name 'zeta' is not defined 不幸的是,当试图复制到错误以便在此处发布时,我发现我无法复制错误,因为以下命令在ipython中工作: zeta,Lm,u_mean=1,4,69 columns=['zeta', 'Lm', 'u_me

我正试图通过以下方式创建一个包含字典理解的字典(这是更大代码的一部分)

第一个
print
完全按照预期打印(变量
zeta
的值),第二个
print
确认
zeta
在本地词典中,但在词典理解命令中,python会因此错误而失败

NameError: name 'zeta' is not defined
不幸的是,当试图复制到错误以便在此处发布时,我发现我无法复制错误,因为以下命令在
ipython
中工作:

zeta,Lm,u_mean=1,4,69
columns=['zeta', 'Lm', 'u_mean']
print('zeta',eval('zeta'))
print(locals())
dic={ col : [eval(col)] for col in columns }
只有代码中的那些命令不起作用。
那么,我是不是遗漏了什么?我可以做一些测试来看看哪里出了问题吗?

字典理解是在一个新的作用域中执行的,很像一个嵌套函数调用。您不能期望在列表中访问父作用域的局部变量

我强烈建议你不要像这样使用当地人。创建一个单独的字典作为命名空间,并在其中查找列:

namespace = {
    'zeta': value_for_zeta,
    # ... etc.
}
然后对列中的列使用
{col:[名称空间[col]]

否则,您可以将
locals()
字典存储在新变量中并引用该变量;直接或通过将其作为
eval()的命名空间传入:

或者简单地说:

namespace = locals()
dic = {col: [namespace[col]] for col in columns}
这现在起作用了,因为
名称空间
是一个闭包;取自父作用域的名称


请注意,相同的限制适用于生成器表达式、集合理解和Python 3中的列表理解。Python 2列表理解是在所有其他类型之前实现的,并且遵循不同的实现策略,不涉及新的作用域,但是这种方法不允许生成器表达式工作,并且通常发现具有单独作用域的新方法工作得更好。

,你有字典理解,而不是列表理解。
namespace = locals()
dic = {col: [eval(col, namespace)] for col in columns}
namespace = locals()
dic = {col: [namespace[col]] for col in columns}