Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加到列表的dict会增加每个键的值_Python_List_Python 3.x_Dictionary - Fatal编程技术网

Python 添加到列表的dict会增加每个键的值

Python 添加到列表的dict会增加每个键的值,python,list,python-3.x,dictionary,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"]) >>>

我有一个空列表字典,所有键都在开头声明:

>>> 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中如何实现这一点?

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

我认为您无法在仍然使用
fromkeys
的情况下解决此问题。试着用听写理解代替

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

按如下方式创建词典:

d = {k: [] for k in keys}
dict.fromkeys()
将对同一列表的引用作为所有键的值放入字典中

您可以通过查看值的
id
将其可视化:

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

由于
id
唯一地标识一个对象,这意味着您有三次相同的对象

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