迭代dict时删除元素的方式正确吗?两种写法是否安全且性能更优?
按条件删除Python字典元素的写法说明
安全性验证
两种写法均满足安全性要求,不会出现遍历过程中修改字典导致的报错:
Python原生不允许在遍历字典的动态视图(dict.items()、dict.keys()、dict.values()返回的都是和原字典实时同步的视图)时修改字典的长度,否则会直接抛出RuntimeError,你的两种写法都规避了这个问题:
- 第一种写法遍历的是
dict_items.copy()生成的原字典浅拷贝,遍历对象和原字典完全独立,删除原字典的键不会对遍历过程产生任何影响 - 第二种写法遍历的是
list(dict_items.keys())生成的静态键列表,和原字典也是相互独立的,修改原字典同样不会干扰遍历。注意你写的示例代码存在小语法笔误,for key in list(dict_items.keys())末尾缺少冒号:,实际运行时需要补上。
开销对比
修改后的写法开销确实更低:
- 第一种写法的
copy()操作会对整个字典做浅拷贝,除了所有键之外,还会生成所有值的引用拷贝,当字典存储的元素量级大、或者值为大对象时,内存和时间开销都会更高 - 第二种写法只生成包含所有键的列表,不需要拷贝值的相关引用,开销更小,在字典数据量越大的场景下优势越明显。
可选的简洁写法
如果你的使用场景允许生成新字典替代修改原字典,Python 3.7+下可以用更简洁的字典推导式实现,代码可读性更高:
# 保留所有不满足删除条件的键值对 dict_items = {k: v for k, v in dict_items.items() if not some_condition}
该写法会生成新的字典对象替换原变量,如果代码中有其他地方引用了原字典对象,修改不会同步到对应引用,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

