填写python字典错误

时间:2013-10-10 15:49:08

标签: python dictionary

我在循环中用另一个字典填充列表时遇到问题:

当我修改字典的某些值时,列表总是采用最新字典修改的值...我不明白为什么。

以下是我的代码的一部分:

l = []
for k in dData.keys():
    baseCourbe['name'] = k
    baseCourbe['dataPoints'] = dData[k]
    l.append(baseCourbe)

我的列表l始终采用分配给baseCourbe的最后一个值。

欢迎任何帮助!

2 个答案:

答案 0 :(得分:1)

您正在使用相同的字典并一遍又一遍地修改它。就好像你这样做:

>>> d = {'sup': 100}
>>> l = [d, d, d, d]
>>> l
[{'sup': 100}, {'sup': 100}, {'sup': 100}, {'sup': 100}]
>>> l[0]['nom'] = 12
>>> l
[{'nom': 12, 'sup': 100}, {'nom': 12, 'sup': 100}, {'nom': 12, 'sup': 100}, {'nom': 12, 'sup': 100}]

如果您希望dicts不同,那么您必须复制它们,例如:

>>> d = {'sup': 100}
>>> l = [dict(d), dict(d), dict(d), dict(d)]
>>> l
[{'sup': 100}, {'sup': 100}, {'sup': 100}, {'sup': 100}]
>>> l[0]['nom'] = 12
>>> l
[{'nom': 12, 'sup': 100}, {'sup': 100}, {'sup': 100}, {'sup': 100}]

在代码的上下文中,您可能需要以下内容:

l = []
for name, points in dData.items():
    baseCopy = dict(baseCourbe)
    baseCopy['name'] = name
    baseCopy['dataPoints'] = points
    l.append(baseCopy)

答案 1 :(得分:1)

当您将baseCourbe追加到l时,您实际附加的内容是对baseCourbe的引用。因此,当您更改baseCourbe时,更改也会反映在l的值中。

例如:

>>>test = {"a":1}
>>>test[2] = 5
>>>l = []
>>>l.append(test)
>>>print l
[{'a': 1, 2: 5}]
>>>test[5] = "abcd"
>>>print l
[{'a': 1, 2: 5, 5: 'abcd'}]