python - 使用字典理解和 eval() 创建字典给我 NameError

标签 python dictionary dictionary-comprehension

我正在尝试通过以下方式创建具有字典理解的字典(这是更大代码的一部分)

columns = ['zeta', 'Lm', 'u_mean']
print('zeta', eval('zeta'))
print(locals())
dic = {col: [eval(col)] for col in columns}

第一个 print 完全按照预期打印(变量 zeta 的值),第二个 print 确认 zeta 在 locals 字典中,但在字典理解命令中 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: [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 列表理解在所有其他类型之前实现,并遵循不涉及新范围的不同实现策略,但这种方法不允许生成器表达式工作,并且通常发现具有单独范围的新方法工作得更好.

关于python - 使用字典理解和 eval() 创建字典给我 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873760/

相关文章:

python - http ://shell. appspot.com/执行代码如何在线?

python - 在 Python 中调用 .x 文件 (Linux) 并列出

python - 在 Python 中,如何将字符串与字典项匹配(如 'Bra*' )

python - 在 Python 中查找字符串中的字符数

python - win32com模块/pythoncom模块自省(introspection)

使用列表作为值的 Python 字典,查找具有相同值的其他键

python - 将列表转换为字典,使用列表中的键和值

c++ - 具有 map<value, key> 和原子操作的 CUDA

python - 在分配变量值之前使用的变量值仍然有效,这个 { k : v for k, v in ... } 语法是如何工作的?

python - python中是否有更简单的编码用于使用字典数据结构进行编码和解码