使用字典理解和 eval() 创建字典给我 NameError
Creating a dict with dictionary comprehension and eval() gives me NameError
我正在尝试通过以下方式创建具有字典理解的字典(这是更大代码的一部分)
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
不幸的是,当为了post在这里尝试重现错误时,我发现我无法重现错误,因为以下命令在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 列表理解在所有其他类型之前实现,并遵循不涉及新范围的不同实现策略,但这种方法不允许生成器表达式工作,并且具有单独范围的新方法通常是发现效果更好。
我正在尝试通过以下方式创建具有字典理解的字典(这是更大代码的一部分)
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
不幸的是,当为了post在这里尝试重现错误时,我发现我无法重现错误,因为以下命令在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 列表理解在所有其他类型之前实现,并遵循不涉及新范围的不同实现策略,但这种方法不允许生成器表达式工作,并且具有单独范围的新方法通常是发现效果更好。