使用枚举循环更新python中的dicts列表不能按预期工作

时间:2015-04-09 21:34:37

标签: python list dictionary

我在python中有一个字典列表。 我想为所有具有唯一值的dicts更新一个键:值对,但所有这些值都获得相同的值。

这是我的代码:

num_cntxts=4
pkt_eop   =[{'type' : 'eop', 'number':1}]
pkt_eop_pattern = pkt_eop*num_cntxts

#I want to add a 'cntxt' key to each of the 4 dicts
#which should have the value as the list position

for i,pkt_eop_inst in enumerate(pkt_eop_pattern):
   print i,pkt_eop_inst
   pkt_eop_inst['cntxt']=i

>0 {'cntxt': 0, 'type': 'eop', 'number': 1}
1 {'cntxt': 2, 'type': 'eop', 'number': 1}
2 {'cntxt': 4, 'type': 'eop', 'number': 1}
3 {'cntxt': 6, 'type': 'eop', 'number': 1}

The print statement shows the individual dict elements but the result is: 

>pkt_eop_pattern
'[{'cntxt': 6, 'type': 'eop', 'number': 1}, {'cntxt': 6, 'type': 'eop', 'number': 1}, {'cntxt': 6, 'type': 'eop', 'number': 1}, {'cntxt': 6, 'type': 'eop', 'number': 1}]

我想要的是匹配打印输出的pkt_eop_pattern:

>pkt_eop_pattern
'[{'cntxt': 0, 'type': 'eop', 'number': 1}, {'cntxt': 2, 'type': 'eop', 'number': 1}, {'cntxt': 4, 'type': 'eop', 'number': 1}, {'cntxt': 6, 'type': 'eop', 'number': 1}]

当我遍历列表时,我希望得到一个指向每个字典的指针。 但是,情况并非如此,因为所有元素都采用了最后一次迭代的值。

1 个答案:

答案 0 :(得分:1)

当你做

时会发生什么
pkt_eop_pattern = pkt_eop*num_cntxts

是您获得一个包含num_cntxts 相同字典引用的列表。

您需要copy字典。幸运的是,因为你在迭代它(并且列表扩展在python中相对轻量级):

num_cntxts=4
pkt_eop   =[{'type' : 'eop', 'number':1}]

#I want to add a 'cntxt' key to each of the 4 dicts
#which should have the value as the list position

for i in xrange(num_cntxts):
   my_copy = pkt_eop.copy()
   pkt_eop_pattern.append(my_copy)
   my_copy['cntxt'] = i