使用字典推导式为字典内列表追加元素为何返回None?
问题原因与解决办法
你遇到的问题核心在于:list.append()是原地修改列表的方法,它的返回值是None。
你写的字典推导式里,每个键对应的值是sample_dict[el].append(3)的执行结果,也就是None,所以最终得到的字典所有value都是None。
正确的实现方式
方式1:原地修改原字典(无需推导式)
如果目标是直接修改原字典里的列表,直接用循环遍历即可,这是最直观的做法:
sample_dict = {'foo':[1], 'bar': [2]} for key in sample_dict: sample_dict[key].append(3)
执行后原字典就会变成你期望的:{'foo': [1,3], 'bar': [2,3]}
方式2:生成新字典(不修改原字典)
如果想保留原字典,生成包含更新后列表的新字典,需要用返回新列表的操作(比如列表拼接),而非原地修改的方法:
sample_dict = {'foo':[1], 'bar': [2]} new_dict = {key: sample_dict[key] + [3] for key in sample_dict}
这里sample_dict[key] + [3]会返回一个新列表,所以新字典的value就是更新后的列表,原字典不会被改动。
也可以先拷贝原列表再追加元素:
new_dict = {key: sample_dict[key].copy() for key in sample_dict} for key in new_dict: new_dict[key].append(3)
关键要点总结
- 区分原地修改方法(返回
None)和返回新对象的操作:像append()、sort()这类原地修改的方法,执行后不会返回修改后的对象,而是返回None;而+、sorted()这类操作会返回新的对象。 - 字典推导式的核心是生成新字典,若只是要修改原字典里的元素,直接用循环比推导式更合适。
内容的提问来源于stack exchange,提问作者user1700890
相关产品推荐
相关产品推荐

