为什么循环中的dict.pop()从未来循环迭代中创建的dict中删除键?

时间:2016-04-07 21:13:54

标签: python loops dictionary

我有一个词典列表:

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被修改了。

有人可以赐教我吗?

1 个答案:

答案 0 :(得分:4)

my_dictlist_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')