RuntimeError:迭代过程中突变的OrderedDict(Python3)

pyt*_*ser 6 python python-3.x

得到标题中提到的错误。下面提到的函数由通过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
Run Code Online (Sandbox Code Playgroud)

blh*_*ing 5

您分配new_ordered_parkstop_dict了ordered_parkstop_dictdict 的引用,因此,当您遍历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
Run Code Online (Sandbox Code Playgroud)

至:

new_ordered_parkstop_dict = ordered_parkstop_dict.copy()
Run Code Online (Sandbox Code Playgroud)

  • 这很可能是因为其他服务器正在运行 Python 2.7 或更早版本,其中允许在迭代时改变 dict。 (2认同)