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

使用dict.get初始化空列表并追加值时返回None的问题及解决

问题分析与解决方案

为什么原代码会返回None?

有两个核心原因:

  1. append()方法的返回值特性:列表的append()是原地修改操作,它不会返回修改后的列表,而是固定返回None。所以你把policy_models.get(r, []).append(r)赋值给p,得到的必然是None。
  2. 临时默认列表未存入字典:当使用policy_models.get(r, [])时,如果键r不存在,会生成一个临时空列表,但这个列表并没有被添加到policy_models字典中。所以每次循环取同一个不存在的键,都会得到新的临时空列表,字典本身始终是空的,自然无法累积值。

正确实现方法

下面提供三种靠谱的实现方式,都能完成「键不存在则创建列表并追加值,存在则追加值」的需求:

方法1:使用dict.setdefault()(推荐,无需额外导入)

setdefault()方法会自动检查键是否存在:不存在则设置默认值(这里是空列表),并返回该值;存在则直接返回对应的值。返回的列表是存在字典中的,所以修改它会同步到字典里。

policy_models = {}
res = ['1', '1', '2', '3', 'x']
for idx, r in enumerate(res):
    # 获取或创建键对应的列表
    target_list = policy_models.setdefault(r, [])
    # 向列表追加值
    target_list.append(r)
    print(idx, r, target_list)

输出:

0 1 ['1']
1 1 ['1', '1']
2 2 ['2']
3 3 ['3']
4 x ['x']

此时policy_models的内容为:{'1': ['1', '1'], '2': ['2'], '3': ['3'], 'x': ['x']}

方法2:使用collections.defaultdict(更简洁)

提前指定字典的默认值类型为列表,访问不存在的键时会自动创建空列表,无需手动判断。

from collections import defaultdict

policy_models = defaultdict(list)
res = ['1', '1', '2', '3', 'x']
for idx, r in enumerate(res):
    target_list = policy_models[r]
    target_list.append(r)
    print(idx, r, target_list)

输出和方法1完全一致,字典会自动维护键对应的列表。

方法3:手动判断键是否存在(最直观,适合新手理解)

直接检查键是否在字典中,不存在就初始化空列表,再追加值:

policy_models = {}
res = ['1', '1', '2', '3', 'x']
for idx, r in enumerate(res):
    if r not in policy_models:
        policy_models[r] = []
    target_list = policy_models[r]
    target_list.append(r)
    print(idx, r, target_list)

逻辑清晰,没有依赖任何特殊方法,适合理解底层逻辑。


内容的提问来源于stack exchange,提问作者Pranjal Doshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:55:20