使用locals()进行Python字典理解时会出现KeyError >a=1 >>>为[“a”]中的键打印{key:locals()[key] 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“”,第1行,在 KeyError:'a'

使用locals()进行Python字典理解时会出现KeyError >a=1 >>>为[“a”]中的键打印{key:locals()[key] 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“”,第1行,在 KeyError:'a',python,dictionary,dictionary-comprehension,Python,Dictionary,Dictionary Comprehension,我怎样才能创建这样理解的词典呢?一个dict理解有自己的名称空间,而该名称空间中的locals()没有a。从技术上讲,除了最外层iterable(此处为[“a”])的初始iterable外,所有内容几乎都作为嵌套函数运行,最外层iterable作为参数传入 如果您使用了globals(),或者在dict理解之外创建了对locals()字典的引用,则代码可以工作: >>> a = 1 >>> print { key: locals()[key] for key

我怎样才能创建这样理解的词典呢?

一个dict理解有自己的名称空间,而该名称空间中的
locals()
没有
a
。从技术上讲,除了最外层iterable(此处为
[“a”]
)的初始iterable外,所有内容几乎都作为嵌套函数运行,最外层iterable作为参数传入

如果您使用了
globals()
,或者在dict理解之外创建了对
locals()
字典的引用,则代码可以工作:

>>> a = 1
>>> print { key: locals()[key] for key in ["a"] }
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
KeyError: 'a'
演示:


您可以尝试改用
globals()

>>> a = 1
>>> l = locals()
>>> { key: l[key] for key in ["a"] }
{'a': 1}
>>> { key: globals()[key] for key in ["a"] }
{'a': 1}

既然
a
不在dict理解的范围内(正如@MartijnPieters所说)。

它应该导致
{“a”:1}
啊,那么我怎么从外部获取信息呢?为什么dict理解有自己的名称空间呢?@dbliss,因为和兰姆达一样的原因functions@dbliss:因为生成器表达式可以。并列出Python 2.7之后的理解。并设定理解。它使实现更干净,并使名称保持本地(这样它们就不会泄漏到周围的作用域中)。如果这是在函数内部呢?然后在dict理解工作之前创建对
locals()
的引用。
>>> a = 1
>>> l = locals()
>>> { key: l[key] for key in ["a"] }
{'a': 1}
>>> { key: globals()[key] for key in ["a"] }
{'a': 1}
print {key : globals()[key] for key in ["a"]}