迭代字典Python时的无限循环

迭代字典Python时的无限循环,python,dictionary,Python,Dictionary,假设我有两张像这样的纸 data_dict = {'A1': 5, 'A2': 10, 'A3': 15} 及 我通过公式dict进行迭代,并在得到表达式时对其求值,然后再次追加到data\u dict的副本,直到所有公式都求值完毕。该逻辑工作正常,但会导致无限循环。如何解决这个无限循环 def update_some(convert_dict, in_dict): in_dict_update = in_dict.copy() convert_dict_update = co

假设我有两张像这样的纸

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

我通过公式dict进行迭代,并在得到表达式时对其求值,然后再次追加到
data\u 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)

同时,在dict更新中打印
也会打印一些垃圾键、值对,比如一些
\uu内置的调用
eval
会将
在dict
中用作缺少标准全局属性的全局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
@哈克托,为什么
len(convert\u dict\u update)
为false(等于
0
),当且仅当
convert\u dict\u update
为false(为空
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