运行时错误:在迭代过程中有序字典被修改(Python3)

12
在标题中提到的错误。下面提到的函数由另一个函数调用,通过POST API调用。
错误出现在打印语句下方的一行。不知道错误的含义和原因。相同的代码在一周前还能运行。
def remove_individual_stops(ordered_parkstop_dict, relevant_data):
    new_ordered_parkstop_dict = ordered_parkstop_dict
    for key, value in ordered_parkstop_dict.items():
        if len(value) == 0:
            for k,v in ordered_parkstop_dict.items():
                if key in v:
                    new_ordered_parkstop_dict.pop(key)
        print (type(ordered_parkstop_dict), ordered_parkstop_dict)
        for k,v in ordered_parkstop_dict.items():
            klist = []
            keylist = []
            if value and v:
                if len(v)==1 and len(value)==1:
                    klist.append(k), keylist.append(key)
                if (keylist == v) and (klist == value and len(value) == 1):
                    new_ordered_parkstop_dict.pop(key)
    return new_ordered_parkstop_dict

3
你可以同时遍历对象并修改它。 - Brown Bear
如何在迭代字典时删除其中的项?我认为这是一个非常相关的答案,除了像答案中那样复制字典。 - aspiring1
2个回答

19

你将 new_ordered_parkstop_dict 赋值为 ordered_parkstop_dict 字典的引用,因此当你遍历 ordered_parkstop_dict.items() 并通过弹出操作来改变 new_ordered_parkstop_dict 时,也会改变 ordered_parkstop_dict,这样做是不可行的,因为循环正在遍历 ordered_parkstop_dict

相反,你应该将 ordered_parkstop_dict 的副本赋值给 new_ordered_parkstop_dict。请进行更改:


```python new_ordered_parkstop_dict = dict(ordered_parkstop_dict) ```
new_ordered_parkstop_dict = ordered_parkstop_dict

致:

new_ordered_parkstop_dict = ordered_parkstop_dict.copy()

1
非常感谢。问题已经解决了,但是您能解释一下为什么同样的代码上周还能正常工作,现在却出现了错误吗? - SPU
错误并不一定是由于您将 new_ordered_parkstop_dict.pop(key) 放在条件块中引起的,因此使用不同的输入,它可能会或可能不会通过满足或不满足条件触发该错误。 - blhsing
3
这很可能是因为另一个服务器正在运行Python 2.7或更早版本,而在迭代过程中改变字典是被允许的。 - blhsing
我曾经有疑虑,但没有检查正在运行的Python版本。先生,非常感谢您的帮助。 - SPU
您不需要任何声望来接受答案。尝试点击答案旁边的灰色复选标记来接受它。 :-) - blhsing
显示剩余2条评论

0
你应该将ordered_parkstop_dict的副本赋值给new_ordered_parkstop_dict,如下所示:使用dict()copy()
new_ordered_parkstop_dict = dict(ordered_parkstop_dict)

new_ordered_parkstop_dict = ordered_parkstop_dict.copy()

此外,您可以使用is运算符来检查对象是否相同,如下所示:
person1 = {"name": "John", "age": 36}
person2 = person1
print(person1 is person2) # True

person1 = {"name": "John", "age": 36}
person2 = dict(person1)
print(person1 is person2) # False

person1 = {"name": "John", "age": 36}
person2 = person1.copy()
print(person1 is person2) # False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接