迭代字典Python时无限循环

时间:2015-07-10 11:35:05

标签: python dictionary

说我有两个像这样的字典,

data_dict = {'A1': 5, 'A2': 10, 'A3': 15}

formula_dict = {'A4': 'A1*A3', 'A6': 'A1+A5+A2', 'A5': 'A1+A2+A3+A4'}

我正在迭代'公式dict并在它得到时评估表达式,然后再次附加到data_dict的副本,直到完全评估所有公式。逻辑工作正常但它会导致无限循环。如何解决这个无限循环?

def update_some(convert_dict, in_dict):
    in_dict_update = in_dict.copy()
    convert_dict_update = convert_dict.copy()
    while convert_dict_update:
        for k, v in list(convert_dict_update.items()):
            print(convert_dict_update.items())
            try:
                return_value = eval(v, in_dict)
                in_dict_update[k] = return_value
                convert_dict_update.pop(k)
            except NameError:
                continue

            update_some(convert_dict_update, in_dict_update)
        print(in_dict_update)
    print('After ', convert_dict_update)
    print(in_dict_update)
    return in_dict_update


# update_some(converted_dict, data_dict)

同时打印in_dict_update会打印一些垃圾密钥,值对像某些__builtins__

1 个答案:

答案 0 :(得分:2)

您对eval的调用使用in_dict作为缺少标准全局属性的全局字典。所以python为你添加它们。尝试:

return_value = eval(v, None, in_dict)

但是,您应该尝试降低递归的复杂性。我建议:

def update_some(convert_dict, in_dict):
    in_dict_update = in_dict.copy()
    skipped_values = {}
    for k,v in convert_dict.items():
        try:
            return_value = eval(v, None, in_dict_update)
        except NameError:
            skipped_values[k] = v
        else:
            in_dict_update[k] = return_value
    if skipped_values:
        in_dict_update = update_some(skipped_values, in_dict_update)
    return in_dict_update