我用这个创建了一个词典:
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]}
我想知道是否有办法做到这一点?
非常感谢提前!
答案 0 :(得分:4)
不要将dict.fromkeys
与可变值一起使用,它只是将对同一列表对象的引用复制到所有键。因此,更改任何一个参考将影响所有列表。
>>> d = dict.fromkeys('abcdef', [])
>>> [id(x) for x in d.values()]
[164654156, 164654156, 164654156, 164654156, 164654156, 164654156]
改为使用dict 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)}
答案 1 :(得分:0)
那是因为你对dict中的每个值使用了相同的列表。
不要将fromkeys
与可变值一起使用。使用词典理解:
a = {round(x*0.1, 1): [0, 0] for x in range(10)}
或者,如果你坚持使用2.6,那就是假字典理解:
a = dict((round(x*0.1, 1), [0, 0]) for x in range(10))
答案 2 :(得分:0)
所有字典条目都引用相同的列表。你最好以不同的方式创建字典:
a = {}
for x in range(10):
a[round(x*0.1,1)] = [0,0]
答案 3 :(得分: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))