我正在做以下事情:
>>> l = []
>>> l
[]
>>> l
[]
>>> d = {}
>>> d['Title'] = {'Age':4}
>>> d
{'Title': {'Age': 4}}
>>> l.append(d)
>>> l
[{'Title': {'Age': 4}}]
>>> d['Title'] = {}
>>> d['Title'] = {'Age':21}
>>> l.append(d)
>>> l
[{'Title': {'Age': 21}}, {'Title': {'Age': 21}}]
不是显示Age 4和21,而是重复最后一个值。我在哪里做错了?
答案 0 :(得分:2)
您重复使用已添加到l
的相同字典对象。如果您要添加 new 字典,请创建一个新对象:
l = []
d = {'Title': {'Age': 4}}
l.append(d)
d = {'Title': {'Age': 21}}
l.append(d)
我使用字典文字一次创建整个结构。
或者,创建d
的副本以添加到l
:
l.append(d.copy())
创建d
的浅表副本。
Python列表包含引用,而不是副本。
答案 1 :(得分:1)
d
只是一个参考。因此,当您更改d
并再次附加l
时,您已有效地将同一对象添加到l
两次。你可以:
在重新使用del
之前使用d
。像这样:
In [58]: d = {}
In [59]: l = []
In [60]: d['Title'] = {'Age':4}
In [61]: l.append(d)
In [62]: del d
In [63]: d = {}
In [64]: d['Title'] = {'Age':21}
In [65]: l.append(d)
In [66]: l
Out[66]: [{'Title': {'Age': 4}}, {'Title': {'Age': 21}}]
使用副本
In [72]: d = {}
In [73]: l = []
In [74]: d['Title'] = {'Age':4}
In [75]: l.append(d.copy())
In [76]: d['Title'] = {'Age':21}
In [77]: l.append(d)
In [78]: l
Out[78]: [{'Title': {'Age': 4}}, {'Title': {'Age': 21}}]
答案 2 :(得分:1)
如果你检查这些对象的id
,它们都是一样的:
>>> l
[{'Title': {'Age': 4}}]
>>> id(l[0])
139978373813960
>>> id(d)
139978373813960
>>> d['Title'] = {}
>>> id(d)
139978373813960
>>> d['Title'] = {'Age':21}
>>> id(d)
139978373813960
>>> l.append(d)
>>> id(l[0])
139978373813960
>>> id(l[1])
139978373813960
答案 3 :(得分:0)
有了这些好的答案,我的一分钱:id()
在这种情况下非常有用,可以证明你的列表中有两个相同字典,而不是两个不同的字典:
In [13]: id.__doc__
Out[13]: "id(object) -> integer\n\nReturn the identity of an object. This is guaranteed to be unique among\nsimultaneously existing objects. (Hint: it's the object's memory address.)"
In [14]: l = []
In [15]: d={}
In [16]: d['Title'] = {'Age':4}
In [17]: l.append(d)
In [18]: d['Title'] = {}
In [19]: d['Title'] = {'Age':21}
In [20]: l.append(d)
In [21]: map(id, l)
Out[21]: [4386697552, 4386697552] #identical