为单个键添加多个Dict值

时间:2014-04-05 19:21:28

标签: python

我正在做以下事情:

>>> 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,而是重复最后一个值。我在哪里做错了?

4 个答案:

答案 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