运行时错误:OrderedDict 在迭代期间发生突变(Python3)

问题描述 投票:0回答:2

出现标题中提到的错误。下面提到的函数由另一个通过 POST api 调用的函数调用。

错误位于 print 语句下面的行。不知道该错误意味着什么以及为什么会出现。一周前运行过相同的代码。

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
python python-3.x iteration ordereddictionary mutated
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
。变化:

new_ordered_parkstop_dict = ordered_parkstop_dict

至:

new_ordered_parkstop_dict = ordered_parkstop_dict.copy()

0
投票

您应该使用

dict()
copy()
ordered_parkstop_dict复制的对象分配给new_ordered_parkstop_dict,如下所示:

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
© www.soinside.com 2019 - 2024. All rights reserved.