关于字典:Python:附加到dicts列表

Python: appending to list of dicts

本问题已经有最佳答案,请猛点这里访问。

当我生成一个dict并将其添加到一个列表中,然后生成第二个结构类似的dict并将其附加到该列表中时,得到的列表是第二个dict的两个副本,而不是同时包含第一个和第二个dict的列表。

我的代码:

1
2
3
4
5
6
7
8
9
    i=1
    UnitTabs = {};   TextUnits=[]
    theseTextUnits = {}
    theseTextUnits['documentId'] = i
    theseTextUnits['xPosition'] = 200; theseTextUnits['yPosition'] = 200;  theseTextUnits['name'] = 'From date'
    TextUnits.append(theseTextUnits)
    theseTextUnits['xPosition'] = 250; theseTextUnits['yPosition'] = 250;   theseTextUnits['name'] = 'To date'
    TextUnits.append(theseTextUnits)
    print(TextUnits)

预期输出:

1
2
[{'xPosition': 200, 'yPosition': 200, 'name': 'From date', 'documentId': 1},
 {'xPosition': 250, 'yPosition': 250, 'name': 'To date', 'documentId': 1}]

实际输出:

1
2
[{'xPosition': 250, 'yPosition': 250, 'name': 'To date', 'documentId': 1},
 {'xPosition': 250, 'yPosition': 250, 'name': 'To date', 'documentId': 1}]


发生这种情况是因为您正在修改同一dict实例:

1
theseTextUnits['name'] = 'To date'

而且,这也会改变原始dict中的值。您需要做的是复制dict,然后修改您想要的值。

1
2
3
4
5
6
import copy
newDict = copy.deepcopy(theseTextUnits)
newDict['xPosition'] = 250
newDict['yPosition'] = 250
newDict['name'] = 'To date'
TextUnits.append(newDict)


python中的字典是可变的对象。这意味着实际值可以更改(而不是返回新对象)

例如:

1
2
3
4
5
6
a={1:1}
b=a
b[1]=2
print(a)

{1:2}


这里发生的是你正在编辑同一本字典。python从不隐式复制对象。如果使用copy方法,它将解决问题。

江户十一〔一〕号