首页 > 解决方案 > for 循环中的 dict() - 不同的行为

问题描述

我正在尝试dict()使用 for 循环动态更新键的值。

def update_dict():
    f = []
    for i, j in enumerate(list_range):
        test_dict.update({'a': i})
        j['c'] = test_dict
        print(j)
        f.append(j)
    print(f)

test_dict = dict({'a': 1})
list_range = [{'b': i} for i in range(0, 5)]
update_dict()

甚至print(j)给出了迭代值(0,1,2,3,4),不知何故最后一个字典被整个列表覆盖并给出错误的输出(4,4,4,4,4)

预期输出,

[{'b': 0, 'c': {'a': 0}}, {'b': 1, 'c': {'a': 1}}, {'b': 2, 'c': {'a': 2}}, {'b': 3, 'c': {'a': 3}}, {'b': 4, 'c': {'a': 4}}]

获得的输出,

[{'b': 0, 'c': {'a': 4}}, {'b': 1, 'c': {'a': 4}}, {'b': 2, 'c': {'a': 4}}, {'b': 3, 'c': {'a': 4}}, {'b': 4, 'c': {'a': 4}}]

我需要了解字典是如何被覆盖的,以及避免这种情况的最佳解决方案是什么?

提前致谢!

PS:请避免建议列表或字典理解方法作为我所知道的答案,并且这个问题的唯一目的是理解 dict() 的错误行为。

标签: pythonjsondictionaryfor-loop

解决方案


您每次都尝试在循环中将值添加到同一个字典中,并且随着循环的进行,您会不断替换这些值。

您需要在每次迭代中定义字典以创建字典的单独 引用:

def update_dict():
    f = []
    for i, j in enumerate(list_range):
        test_dict = {'a': i}
        j['c'] = test_dict
        f.append(j)
    print(f)


list_range = [{'b': i} for i in range(0, 5)]
update_dict()

# [{'b': 0, 'c': {'a': 0}}, 
#  {'b': 1, 'c': {'a': 1}},
#  {'b': 2, 'c': {'a': 2}},
#  {'b': 3, 'c': {'a': 3}},
#  {'b': 4, 'c': {'a': 4}}]

推荐阅读