当密钥不存在时,为什么我没有得到 KeyError?

Why didn't I get a KeyError when the key did not exist?

在下面的测试数据中,我尝试将键 'x' 值附加到列表 ls。我的问题是为什么在遍历第一行数据时没有出现 KeyError。显然,第一行不包含键 'x'。本来我以为我必须使用 Try/Except 来避免在循环数据时出错,但似乎不需要 Try/Except 。

谁能帮我理解为什么这里没有生成 KeyError?

data = [{u'xyz': []},
        {u'xyz': [{u'x' : 2,
                   u'y' : 3, 
                   u'z' : 4}]}]

ls = []

for item in data:
    ddd = item['xyz']
    print ddd

    for d in ddd:
        ls.append(d['x'])

ls

输出:

[]
[{u'y': 3, u'x': 2, u'z': 4}]

[2]

空循环不会运行:

>>> for item in []:
...     print item
...
>>>

所以

data = [{u'xyz': []},
            ...       ]


# first time through
for item in data:
    ddd = item['xyz']

    # ddd is an empty list

    for d in ddd:
        # this doesn't run, therefore no KeyError
        ls.append(d['x'])

Try/Except 如果你想 捕获 一个 KeyError,如果你想 避免 一个你可以做:

if 'x' in d:  # test if 'x' is a key in d

or

d.get('x')    # returns the value, or None

第一行是一个空列表,没有KeyError因为里面没有字典。所以循环:

for d in ddd:

未输入。尝试将第一行更改为:

data = [{u'xyz': [{}]},

您会按预期看到 KeyError