我正试图以以下方式创建一个字典,其中包含字典理解(这是一个大得多的代码的一部分)
columns = ['zeta', 'Lm', 'u_mean']
print('zeta', eval('zeta'))
print(locals())
dic = {col: [eval(col)] for col in columns}第一个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 }只有我的代码中的那些命令不起作用。我是不是漏掉了什么?我能做些什么来看看出了什么问题吗?
发布于 2015-09-30 19:07:49
字典理解是在一个新的范围内执行的,非常类似于嵌套函数调用。不能期望在列表理解中访问父作用域的局部变量。
我强烈建议你不要像这样使用本地人。创建一个单独的字典作为名称空间,并在以下内容中查找您的列:
namespace = {
'zeta': value_for_zeta,
# ... etc.
}然后使用{col: [namespace[col]] for col in columns}。
否则,您可以将locals()字典存储在一个新变量中,并引用它;直接地,或者通过将它作为eval()的命名空间传递进来。
namespace = locals()
dic = {col: [eval(col, namespace)] for col in columns}或者简单地说:
namespace = locals()
dic = {col: [namespace[col]] for col in columns}这现在起作用了,因为namespace是一个闭包;一个从父作用域取来的名称。
请注意,同样的限制适用于生成器表达式、集理解以及Python 3中的列表理解。Python 2列表理解是在所有其他类型之前实现的,并且遵循了不涉及新范围的不同实现策略,但这种方法不允许生成器表达式工作,而且具有单独作用域的新方法通常会更好地工作。
https://stackoverflow.com/questions/32873760
复制相似问题