You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段简单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表达式的求值顺序是从左到右,这行代码的执行步骤和你想的不一样:

  1. 首先求值dict1['old_key']:此时old_key还在字典里,直接返回对应的列表对象(记为L,也就是[{'name': 'A'}])。
  2. 接着执行dict1.pop('old_key'):把old_key从字典中彻底删除,同时返回同一个列表对象L。
  3. 最后调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:14:57