迭代字典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