为何这段简单Python代码运行后得到空字典?
为什么这段Python代码会生成空字典?
先看你给出的代码:
from collections import defaultdict dict1 = defaultdict(list) dict1['old_key'] = [{'name': 'A'}] dict1['old_key'].extend(dict1.pop('old_key')) print(dict1)
你预期得到{'old_key': [{'name': 'A'}]},但实际输出是空字典,核心原因是Python表达式的求值顺序是从左到右,这行代码的执行步骤和你想的不一样:
- 首先求值
dict1['old_key']:此时old_key还在字典里,直接返回对应的列表对象(记为L,也就是[{'name': 'A'}])。 - 接着执行
dict1.pop('old_key'):把old_key从字典中彻底删除,同时返回同一个列表对象L。 - 最后调用
L.extend(L):把L里的元素添加到自身,此时L会变成[{'name': 'A'}, {'name': 'A'}],但关键是——这个L已经和字典dict1没有关系了!因为步骤2已经把old_key从字典中移除,字典里再也没有这个键,自然打印出来就是空字典。
你之前的理解错误在于,以为dict1['old_key'].extend(...)会在pop之后触发defaultdict的默认值生成,但实际上dict1['old_key']是在pop之前就已经拿到了存在的列表,后续的pop只是把键从字典中删除,并不会影响已经拿到的列表对象,但这个列表对象已经不在字典里了。
解决思路
正如你提到的,拆分两行代码就能避免这个问题:先把pop的结果存起来,再执行extend:
from collections import defaultdict dict1 = defaultdict(list) dict1['old_key'] = [{'name': 'A'}] val = dict1.pop('old_key') dict1['old_key'].extend(val) print(dict1) # 输出 {'old_key': [{'name': 'A'}]}
或者在操作前判断新键是否和旧键一致,直接跳过pop操作。
内容的提问来源于stack exchange,提问作者AllSolutions
相关产品推荐
相关产品推荐

