首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个包含字典理解和eval()的dict给了我NameError

创建一个包含字典理解和eval()的dict给了我NameError
EN

Stack Overflow用户
提问于 2015-09-30 19:03:50
回答 1查看 465关注 0票数 4

我正试图以以下方式创建一个字典,其中包含字典理解(这是一个大得多的代码的一部分)

代码语言:javascript
复制
columns = ['zeta', 'Lm', 'u_mean']
print('zeta', eval('zeta'))
print(locals())
dic = {col: [eval(col)] for col in columns}

第一个print完全按照预期打印(变量zeta的值),第二个print确认zeta在局部变量字典中,但是在字典理解命令python中出现了此错误。

代码语言:javascript
复制
NameError: name 'zeta' is not defined

不幸的是,当试图复制到错误以便在这里发布时,我发现无法重现错误,因为下面的命令在ipython中工作

代码语言:javascript
复制
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 }

只有我的代码中的那些命令不起作用。我是不是漏掉了什么?我能做些什么来看看出了什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-30 19:07:49

字典理解是在一个新的范围内执行的,非常类似于嵌套函数调用。不能期望在列表理解中访问父作用域的局部变量。

我强烈建议你不要像这样使用本地人。创建一个单独的字典作为名称空间,并在以下内容中查找您的列:

代码语言:javascript
复制
namespace = {
    'zeta': value_for_zeta,
    # ... etc.
}

然后使用{col: [namespace[col]] for col in columns}

否则,您可以将locals()字典存储在一个新变量中,并引用它;直接地,或者通过将它作为eval()的命名空间传递进来。

代码语言:javascript
复制
namespace = locals()
dic = {col: [eval(col, namespace)] for col in columns}

或者简单地说:

代码语言:javascript
复制
namespace = locals()
dic = {col: [namespace[col]] for col in columns}

这现在起作用了,因为namespace是一个闭包;一个从父作用域取来的名称。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32873760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档