【发布时间】:2019-03-09 19:17:08
【问题描述】:
我正在尝试使用 for 循环动态更新 dict() 键的值。
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}}]
我需要了解字典是如何被覆盖的,以及避免这种情况的最佳解决方案是什么?
提前致谢!
附: :请避免建议列表或字典理解方法作为我所知道的简单答案,这个问题的唯一目的是理解 dict() 的错误行为。
【问题讨论】:
-
test_dict对于所有字典都是相同的。随时更新它会更新所有子字典。 -
@Jean-FrançoisFabre 在调试时我看到每次迭代都有不同的值
-
当然可以,但是之前存储的所有值都被更改了
-
那么 dict.update() 会更新列表中的所有值吗?
-
j['c']不会创建任何新值,它指向单个对象test_dict。将此添加到您的脚本中,j['c'] = test_dict, id(test_dict)并查看该函数之外的单个 dict 对象。
标签: python json dictionary for-loop