Python中列表字典中元素的增量

blu*_*fer 3 python dictionary

我有这个简单的代码:

M = dict.fromkeys([0, 1, 2, 3, 4], [0, 0])
M[0][1] += 2
print(M)
Run Code Online (Sandbox Code Playgroud)

为什么这是输出?

{0: [0, 2], 1: [0, 2], 2: [0, 2], 3: [0, 2], 4: [0, 2]}
Run Code Online (Sandbox Code Playgroud)

它会增加字典中列表的所有元素!我想用键0增加列表的第二个元素,如下所示:

{0: [0, 2], 1: [0, 0], 2: [0, 0], 3: [0, 0], 4: [0, 0]}
Run Code Online (Sandbox Code Playgroud)

Nik*_* B. 10

所有值都M指向完全相同的列表.证明:

>>> map(id, M.values())
[139986331512912, 139986331512912, 139986331512912, 139986331512912, 139986331512912]
Run Code Online (Sandbox Code Playgroud)

如果更改它,它将影响所有键.尝试为每个键创建一个新列表:

>>> M = { k:[0,0] for k in [0, 1, 2, 3, 4] }
>>> M[0][1] += 2
>>> print(M)
{0: [0, 2], 1: [0, 0], 2: [0, 0], 3: [0, 0], 4: [0, 0]}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,如果`dict.fromkeys`采用值的结构,而不是值本身(如[`defaultdict`](http://docs.python.org/library/collections.html#defaultdict),那将是一件好事. -objects)) (3认同)