Python中如何避免在遍历字典时修改字典导致的RuntimeError

shuzi = {‘1’: {‘end’: 3247341040L, ‘star’: 3247341040L}, 2: {‘end’: 1033039063, ‘star’: 1033039056},3:{‘end’:111,‘star’:2222222222222}}
for key1 in shuzi.keys():
if not shuzi.has_key(key1):
break
for key2 in shuzi.keys():
Python中如何避免在遍历字典时修改字典导致的RuntimeError

4 回复

shuzi = {‘1’: {‘end’: 3247341040L, ‘star’: 3247341040L}, 2: {‘end’: 1033039063, ‘star’: 1033039056},3:{‘end’:111,‘star’:2222222222222}}
for key1 in shuzi.keys():
print key1
if not shuzi.has_key(key1):
break
for key2 in shuzi:

"""
有没有更好得解决方法?


在Python里,直接边遍历字典边修改它(比如删除键)会触发RuntimeError: dictionary changed size during iteration。这是因为字典在迭代时内部状态被修改,迭代器失效了。

核心解决方案是:遍历字典键(或项)的副本,而不是原字典。

方法一:遍历键列表的副本(最常用)

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# 错误示范(会报RuntimeError):
# for key in my_dict:
#     if my_dict[key] % 2 == 0:
#         del my_dict[key]

# 正确做法:遍历键的副本
for key in list(my_dict.keys()):  # 用list()创建副本
    if my_dict[key] % 2 == 0:
        del my_dict[key]

print(my_dict)  # 输出: {'a': 1, 'c': 3}

方法二:使用字典推导式(适合创建新字典)

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# 保留值为奇数的项
my_dict = {k: v for k, v in my_dict.items() if v % 2 != 0}
print(my_dict)  # 输出: {'a': 1, 'c': 3}

方法三:记录要删除的键,遍历完再删

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
keys_to_delete = []

for key, value in my_dict.items():
    if value % 2 == 0:
        keys_to_delete.append(key)

for key in keys_to_delete:
    del my_dict[key]

print(my_dict)  # 输出: {'a': 1, 'c': 3}

总结:遍历时别动原字典,要么操作副本要么先记下来。

shuzi = {‘1’: {‘end’: 3247341040L, ‘star’: 3247341040L}, 2: {‘end’: 1033039063, ‘star’: 1033039056},3:{‘end’:111,‘star’:2222222222222}}
for key1 in shuzi.keys():
if not shuzi.has_key(key1):
break
for key2 in shuzi:

回到顶部