列表推导式更新字典为何返回None?求正确实现方法
为什么会得到[None, None, None]?
因为dict.update()方法是原地修改字典,它的返回值固定为None。你写的列表推导式里,{**m}先创建了原字典的浅拷贝,紧接着调用.update({"b":5}),但推导式会把这个方法的返回值(也就是None)作为新列表的元素,最终自然得到全是None的列表。
正确实现方法
有几种不同的思路,可根据需求选择:
1. 生成新字典(不修改原字典)
直接用字典解包合并的方式,在生成新字典时覆盖b的值:
d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}] d = [{**m, "b":5} for m in d] # 结果:[{"a":1, "b":5},{"a":3, "b":5},{"a":5, "b":5}]
这种方式会创建全新的字典,原字典不会被改动。
2. 原地修改原字典(节省内存)
如果不需要保留原来的字典内容,可以直接遍历列表修改每个字典的b值:
d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}] for m in d: m["b"] = 5 # 此时d就是预期结果,不需要重新赋值
这种方式没有创建新字典,直接修改原列表里的字典对象,内存占用更小。
3. 用dict()构造器生成新字典
和第一种思路类似,利用dict()的特性传入原字典和要覆盖的键值:
d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}] d = [dict(m, b=5) for m in d] # 同样得到预期结果
内容的提问来源于stack exchange,提问作者Honza S.
相关产品推荐
相关产品推荐

