我有一个词典列表:
list_dicts = [{'a': 1, 'b': 0.1, 'c': 'yes'}, {'a': 2, 'b': 0.2, 'c': 'no'}]
当我遍历列表时,我显然可以打印键的值" c"。如果我在打印后用pop()
删除此密钥没有问题,因为在循环的每次迭代中都会重新创建字典my_dict
(据我所知)。
for my_dict in list_dicts:
print my_dict['c']
my_c = my_dict.pop('c', 'dunno')
但是,当我在另一个循环中重新运行上面的代码时:
for i in xrange(1,3):
for my_dict in list_dicts:
print my_dict['c']
my_c = my_dict.pop('c', 'dunno')
然后我在外环(KeyError: 'c'
)的第二次迭代的print my_dict['c']
中得到错误i=2
。
我不明白为什么会这样。如果我在第一个循环后重新创建list_dicts
,则错误消失:
for i in xrange(1,3):
for my_dict in list_dicts:
print my_dict['c']
my_c = my_dict.pop('c', 'dunno')
list_dicts = [{'a': 1, 'b': 0.1, 'c': 'yes'}, {'a': 2, 'b': 0.2, 'c': 'no'}]
但我不明白为什么list_dicts
被修改了。
有人可以赐教我吗?
答案 0 :(得分:4)
my_dict
是list_dicts
中dict的引用。这是不是 dict的副本,它是对它的直接引用。修改my_dict
会修改list_dicts
。
您可以通过在弹出后打印list_dicts
来验证这一点。
for my_dict in list_dicts:
print my_dict['c']
my_c = my_dict.pop('c', 'dunno')
print list_dicts
如果您需要明确创建它们的dicts副本。
for my_dict in list_dicts:
copy = dict(my_dict)
my_c = copy.pop('c', 'dunno')