Python如何删除用户指定字典键?循环删除报错原因解析
为什么遍历字典时删除键会触发RuntimeError?
错误原因
Python 里用 for i in phoneNumbers.keys() 遍历字典键的时候,迭代器是基于字典的实时状态运行的。当你在循环里执行 del phoneNumbers[remove] 删除键时,字典的大小直接改变,这会打乱迭代器原本的遍历逻辑——它没法确定后续该遍历哪个键,也没法保证遍历的完整性,所以 Python 直接抛出 RuntimeError: dictionary changed size during iteration 错误,避免出现不可预料的结果。
正确写法的合理性
你给出的正确代码直接用 del phoneNumbers[remove] 删除指定键,这是因为字典的键是唯一的,不需要遍历查找,直接通过键名就能定位并删除对应的键值对,效率更高,也不会触发迭代时修改字典的问题。
如果非要在遍历中删除怎么办?
要是有场景必须遍历字典并删除元素,可以先把键转换成列表副本,迭代这个副本而非原字典的键视图:
phoneNumbers = {'John': '534-7887', 'Steven': '988-1187', "Max" : "765-2334", "Matt" : "987-1222"} remove = input("Which key do you want to remove? ") # 把键转换成列表,迭代固定副本 for i in list(phoneNumbers.keys()): if i == remove: del phoneNumbers[remove] print(phoneNumbers)
这样迭代的是列表的固定副本,修改原字典不会影响遍历过程,也就不会报错了。
你的错误代码示例:
phoneNumbers = {'John': '534-7887', 'Steven': '988-1187', "Max" : "765-2334", "Matt" : "987-1222"} remove = input("Which key do you want to remove? ") for i in phoneNumbers.keys(): if i == remove: del phoneNumbers[remove] print(phoneNumbers)
正确代码示例:
phoneNumbers = {'John': '534-7887', 'Steven': '988-1187', "Max" : "765-2334", "Matt" : "987-1222"} remove = input("Which key do you want to remove? ") del phoneNumbers[remove] print(phoneNumbers)
内容的提问来源于stack exchange,提问作者Aleksandra Milicevic
相关产品推荐
相关产品推荐

