首页 > 解决方案 > 字典 KeyNotFound

问题描述

对于比我更有知识的人的快速问题 - 为什么第一行代码有效但第二行无效?在我看来,我正在以两种等效的方式做同样的事情,但是 {...} 方法会引发错误,而 dict([]) 方法不会:

print dict([(key,locals()[key]) for key in ["Type","NoPoints","PointNos","Zoff"]])

print       {key:locals()[key] for key in ["Type","NoPoints","PointNos","Zoff"]}

输出:

{'Zoff': ['1', '1', '0', '0'], 'NoPoints': 4, 'Type': 'PANEL', 'PointNos': ['253', '254', '254', '253']}

Runtime error (KeyNotFoundException): Type

Traceback:
    line 143, in AddArea, "<string>"

#EDIT - 我更正了key,locals()key:locals()这是我在编辑器中所做的 - 为我在那里所做的糟糕的复制/粘贴工作道歉!)我的错误仍然存​​在

我还应该补充一点,我正在使用 Python 2.7 (IronPython)

标签: pythondictionary

解决方案


请参阅此相关问题的答案: Can't use locals() in list comprehension in Python 3?

列表推导在 Python 3 中有自己的本地范围(因此也有 locals() dict)

您可以通过这样的比较来验证它:

print(locals().keys())
print([locals().keys() for i in [1]][0])

字典理解也会发生同样的事情。

另外,您需要用 a:而不是 a来分隔键和值,来制作字典。

编辑:

虽然 Python 2 (IronPython) 中的列表理解似乎不会出现这个问题,但字典理解似乎就是这种情况:

print(locals().keys())
print([locals().keys() for i in [1]][0]) # list comprehension
print({"test":locals().keys() for i in [1]}) # dict comprehension

结果:

['__name__', '__file__', '__doc__', '__builtins__']
['__name__', '__file__', '__doc__', '__builtins__', 'i']
{'test': ['i']}

推荐阅读