在python中运行dict列表的意外结果

时间:2015-03-15 06:28:00

标签: python list dictionary

我想通过两层循环生成一个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”,它总是会改变。 我对这怎么可能发生以及如何解决它感到有点困惑?

非常感谢!

2 个答案:

答案 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如何使用指针和浅/深复制。