我有一个空列表字典,其中包含在开头声明的所有键:
>>> 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中实现这一目标?
答案 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
唯一标识一个对象,这意味着您有三次相同的对象。