python - 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() 的错误行为。
解决方案
您每次都尝试在循环中将值添加到同一个字典中,并且随着循环的进行,您会不断替换这些值。
您需要在每次迭代中定义字典以创建字典的单独 引用:
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}}]
推荐阅读
- javascript - 你可以在 jquery 的函数中添加两个元素吗?
- python - Spark DataFrame 生成 beta 样本
- javascript - 我想自动将 myObj 信息输入到 HTML 表中
- wordpress - 在产品图像悬停时显示带有文本的透明 div
- python - 具有已知或未知维度的零张量
- sql-server - 将其他 LINQ 表达式添加到 ServiceStack.OrmLite 中的 SELECT 查询
- flutter - 键入'MappedListIterable
' 不是类型 'List 的子类型 ' - .htaccess - Htaccess 用 QSA 重写 url
- discord.js - Discord bot 未提及 msg.author.username
- c# - if 语句中的 C# 6.0 空条件运算符