0

我用这个创建了一个字典:

a = dict.fromkeys([round(x*0.1,1) for x in range(10)], [0,0])

它会给我以下结果:

>>> a
{0.0: [0, 0], 0.5: [0, 0], 0.2: [0, 0], 0.4: [0, 0], 0.8: [0, 0], 0.6: [0, 0], 0.3: [0, 0], 0.1: [0, 0], 0.9: [0, 0], 0.7: [0, 0]}

例如,我只想更新 key=0.5 的第二个值。我正在使用以下代码:

a[0.5][1]=a[0.5][1]+10

然而,事实证明它更新了所有键的所有秒值。

>>> a
{0.0: [0, 10], 0.5: [0, 10], 0.2: [0, 10], 0.4: [0, 10], 0.8: [0, 10], 0.6: [0, 10], 0.3: [0, 10], 0.1: [0, 10], 0.9: [0, 10], 0.7: [0, 10]}

我想知道是否有办法做到这一点?

提前谢谢了!

4

4 回答 4

4

不要dict.fromkeys与可变值一起使用,它只是将对同一列表对象的引用复制到所有键。因此,更改任何一个引用都会影响所有列表。

>>> d = dict.fromkeys('abcdef', [])
>>> [id(x) for x in d.values()]
[164654156, 164654156, 164654156, 164654156, 164654156, 164654156]

使用 adict comprehension代替:

>>> d = {k:[] for k in  'abcdef'}
>>> [id(x) for x in d.values()]
[164621484, 164653580, 164331340, 164653804, 164653900, 164653836]

对于您的代码,它将是:

a = {round(x*0.1,1): [0, 0] for _ in range(10)}
于 2013-11-07T22:02:20.010 回答
0

您使用相同的列表实例作为所有键的值。代替:

a=dict.fromkeys([round(x*0.1,1) for x in range(10)], [0,0])

像这样初始化它:

a=dict((round(x*0.1,1), [0, 0]) for x in range(10))
于 2013-11-07T22:04:20.807 回答
0

那是因为您对字典中的每个值都使用了相同的列表。

不要fromkeys与可变值一起使用。使用 dict 理解:

a = {round(x*0.1, 1): [0, 0] for x in range(10)}

或者,如果你坚持使用 2.6,一个假的 dict 理解:

a = dict((round(x*0.1, 1), [0, 0]) for x in range(10))
于 2013-11-07T22:02:59.550 回答
0

所有字典条目都引用同一个列表。您最好以不同的方式创建字典:

a = {}
for x in range(10):
    a[round(x*0.1,1)] = [0,0] 
于 2013-11-07T22:03:51.723 回答