我想通过两层循环生成一个dict列表。在外部循环中,生成的dict将附加到列表中。但预计产量不会如下:
inf = [] infdic = {} keys = ['t1', 't2', 't3', 't4', 't5'] for c1 in range(2): for c2 in range(5): value = c1*10+c2 key = keys[c2] infdic[key] = value inf.append(infdic) print c1, inf
上述代码的结果是:
0 [{'t4': 3, 't5': 4, 't2': 1, 't3': 2, 't1': 0}] 1 [{'t4': 13, 't5': 14, 't2': 11, 't3': 12, 't1': 10}, {'t4': 13, 't5': 14, 't2': 11, 't3': 12, 't1': 10}]
但我想要的应该是:
0 [{'t4': 3, 't5': 4, 't2': 1, 't3': 2, 't1': 0}] 1 [{'t4': 3, 't5': 4, 't2': 1, 't3': 2, 't1': 0}, {'t4': 13, 't5': 14, 't2': 11, 't3': 12, 't1': 10}]
看起来列表“inf”指向“infdic”,它总是会改变。 我对这怎么可能发生以及如何解决它感到有点困惑?
非常感谢!
答案 0 :(得分:2)
看起来列表“inf”指向“infdic”,它总是改变为 确实如此。
是的,那是完全你的代码所要做的事情,而且,瞧,Python正是你告诉它的! - )
修复:每次创建一个新的infdic
:
for c1 in range(2):
infdic = {}
for c2 in range(5):
...
答案 1 :(得分:1)
问题是您没有在最外层循环中重置infdic
。
您循环浏览c1
并按预期设置infdic
。但是你循环遍历c2
并覆盖infidc的内容!可以通过在最外层循环中设置infdic = {}
来修复它:
inf = [] keys = ['t1', 't2', 't3', 't4', 't5'] for c1 in range(2): infdic = {} for c2 in range(5): value = c1*10+c2 key = keys[c2] infdic[key] = value inf.append(infdic) print c1, inf
另外,关于你的观察:
它看起来是列表" inf"指向" infdic",它总是随着它而改变。
是的,没错。当您编写inf.append(infdic)
时,您将{strong>指针附加到infdic
到列表inf
。您没有复制列表的静态版本(尽管您可以使用copy.deepcopy
)。我建议你阅读Python如何使用指针和浅/深复制。