Python 2.7列表更改字典

问题描述 投票:0回答:1

我的字典如下

    {
     '34.8': [[0, 0, 0, 0], [0, 0, 0, 0]], 
     '34.6': [[0, 0, 0, 0], [0, 0, 0, 0]],
     '35.0': [[0, 0, 0, 0], [0, 0, 0, 0]], 
     '34.4': [[0, 0, 0, 0], [0, 0, 0, 0]],
     '34.2': [[0, 0, 0, 0], [0, 0, 0, 0]], 
     '34.0': [[0, 0, 0, 0], [0, 0, 0, 0]] 
}

我运行代码。

print '34.6', testDic['34.6']
print '34.8', testDic['34.8']

testDic['34.6'][0][0] = 1234

print testDic

但结果是

{
'34.8': [[1234, 0, 0, 0], [0, 0, 0, 0]], 
'34.6': [[1234, 0, 0, 0], [0, 0, 0, 0]], 
'35.0': [[1234, 0, 0, 0], [0, 0, 0, 0]], 
'34.4': [[1234, 0, 0, 0], [0, 0, 0, 0]], 
'34.2': [[1234, 0, 0, 0], [0, 0, 0, 0]], 
'34.0': [[1234, 0, 0, 0], [0, 0, 0, 0]]}

为什么改变所有的dic值?以及如何仅更改1(例如'34 .6')?

python python-2.7
1个回答
0
投票

正如评论中所建议的那样,你正在转换dict的所有值,因为它们引用了同一个对象,在你的情况下是一个列表列表。看看这个例子:

d = dict(zip(keys, [[[0]*4]*2]*len(keys)))
d['34.6'][0][0] = 1234
print d

{'34.0': [[1234, 0, 0, 0], [1234, 0, 0, 0]],
 '34.2': [[1234, 0, 0, 0], [1234, 0, 0, 0]],
 '34.4': [[1234, 0, 0, 0], [1234, 0, 0, 0]],
 '34.6': [[1234, 0, 0, 0], [1234, 0, 0, 0]],
 '34.8': [[1234, 0, 0, 0], [1234, 0, 0, 0]],
 '35.0': [[1234, 0, 0, 0], [1234, 0, 0, 0]]}

在这种情况下,甚至链接单个列表并转换它们的第一个值。否则,如果您“强制”为每个键创建一个新的列表列表,则可以避免此问题,因为词典的每个项目都是独立的。

d = {}
for key in keys:
    d[key] = [[0]*4] + [[0]*4]
d['34.6'][0][0] = 1234

print d

{'34.0': [[0, 0, 0, 0], [0, 0, 0, 0]],
 '34.2': [[0, 0, 0, 0], [0, 0, 0, 0]],
 '34.4': [[0, 0, 0, 0], [0, 0, 0, 0]],
 '34.6': [[1234, 0, 0, 0], [0, 0, 0, 0]],
 '34.8': [[0, 0, 0, 0], [0, 0, 0, 0]],
 '35.0': [[0, 0, 0, 0], [0, 0, 0, 0]]}
© www.soinside.com 2019 - 2024. All rights reserved.