繁体   English   中英

针对单个键添加多个Dict值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM