Python列表推导式问题:添加字典键后结果变为None
为什么你的列表推导式会得到None?
嘿,这个问题我之前也踩过坑!核心问题出在dict.update()方法的返回值上——它是个原地修改的方法,只会直接改动原字典,不会返回修改后的字典,而是返回None。
你写的列表推导式[r.update({ 'new_key': 'new_value'}) for r in lod],其实是把每个update调用的返回值(也就是None)收集成了一个新列表,然后你把这个列表重新赋值给了lod,所以最后lod就变成了[None](如果原列表有多个元素,就是对应数量的None组成的列表),完全不是你期望的带新键的字典列表。
正确的两种做法
1. 原地修改原列表(最直接)
如果只是想给原列表里的字典添加新键,不需要生成新列表,直接用普通的for循环就行,别用列表推导式做这种副作用操作:
lod = [{'name': 'storm', 'age': 99}] for r in lod: r.update({'new_key': 'new_value'})
执行完后,lod还是原来的列表,里面的字典已经多了new_key键。
2. 生成新的字典列表(保留原字典)
如果想保留原字典不变,生成一个包含新键的新字典列表,可以用字典解包的方式在列表推导式里创建新字典:
lod = [{'name': 'storm', 'age': 99}] lod = [{**r, 'new_key': 'new_value'} for r in lod]
这里**r会把原字典的所有键值对展开,再加上新的键值对,生成一个全新的字典,列表推导式收集这些新字典,赋值给lod后就是你想要的结果。
另外提醒一句:列表推导式的设计初衷是生成新列表,不是用来执行原地修改这种副作用操作,以后遇到类似场景尽量避免哦~
内容的提问来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

