[英]Adding Multiple Dict Value against a Single Key
我正在执行以下操作:
>>> 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}}]
不再显示年龄4和21,而是重复最后一个值。 我在哪里做错了?
您重用了已经添加到l
的相同字典对象。 如果要添加新字典,请创建一个新对象:
l = []
d = {'Title': {'Age': 4}}
l.append(d)
d = {'Title': {'Age': 21}}
l.append(d)
我使用字典文字立即创建了整个结构。
或者,创建d
的副本以添加到l
:
l.append(d.copy())
这将创建d
的浅表副本。
Python列表保存引用 ,而不是副本。
d
只是参考。 因此,当您更改d
并再次将其附加到l
时,实际上已将同一对象两次添加到l
。 您可以:
在再次使用d
之前,请先使用del
。 像这样:
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}}]
如果您检查这些对象的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
有了所有这些好的答案,我的一分钱: 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.