我有一个字典列表:
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')
然后我在外循环的第二次迭代的 print my_dict['c']
中得到错误 KeyError: '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
被修改了。
谁能教教我吗?
最佳答案
my_dict
是对 list_dicts
中字典的引用。它不是 dict 的副本,而是对其的直接引用。修改 my_dict
会修改 list_dicts
的元素。
您可以通过在 pop 之后打印 list_dicts
来验证这一点。
for my_dict in list_dicts:
print my_dict['c']
my_c = my_dict.pop('c', 'dunno')
print list_dicts
如果你想要字典的副本,你需要明确地创建它们。
for my_dict in list_dicts:
copy = dict(my_dict)
my_c = copy.pop('c', 'dunno')
关于python - 为什么循环中的 dict.pop() 会从 future 循环迭代中创建的字典中删除键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36487338/