附加到列表的dict为每个键增加了价值

时间:2016-01-29 20:50:15

标签: python list python-3.x dictionary

我有一个空列表字典,其中包含在开头声明的所有键:

>>> keys = ["k1", "k2", "k3"]
>>> d = dict.fromkeys(keys, [])
>>> d
{'k2': [], 'k3': [], 'k1': []}

当我尝试将一个坐标对(列表["x1", "y1"])添加到其中一个关键字列表中时,它会添加到所有关键字'列表:

>>> d["k1"].append(["x1", "y1"])
>>> d
{'k1': [['x1', 'y1']], 'k2': [['x1', 'y1']], 'k3': [['x1', 'y1']]}

我在寻找的是:

>>> d
{'k1': [['x1', 'y1']], 'k3': [], 'k1': []}

如何在Python 3中实现这一目标?

3 个答案:

答案 0 :(得分:4)

看起来每个列表实际上都是对单个列表的引用。附加到其中一个附加到所有这些。

我不认为你可以在使用fromkeys时解决这个问题。请尝试使用字典理解。

d = {k: [] for k in keys}

答案 1 :(得分:3)

fromkeys是一个类方法,它将第二个参数作为所有键的值传递,因此它们都将引用一个对象。相反,如果你没有传递值,python会将None视为每个项的值。然后,您可以为您的密钥分配2d列表,而不是追加:

>>> d = dict.fromkeys(keys)
>>> d["k1"] = [["x1", "y1"]]
>>> d
{'k3': None, 'k2': None, 'k1': [['x1', 'y1']]}

这就是python创建fromkeys方法的方法:

@classmethod
def fromkeys(cls, iterable, value=None):
    d = cls()
    for key in iterable:
        d[key] = value
    return d

答案 2 :(得分:2)

像这样创建你的字典:

d = {k: [] for k in keys}

dict.fromkeys()将与所有键的值相同的列表引用到字典中。

您可以通过查看价值的id来形象化:

>>> d = dict.fromkeys(keys,[])
>>> [id(v) for v in d.values()]
[4413495432, 4413495432, 4413495432]

因为id唯一标识一个对象,这意味着您有三次相同的对象。