python - 为什么循环中的 dict.pop() 会从 future 循环迭代中创建的字典中删除键?

标签 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')

然后我在外循环的第二次迭代的 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/

相关文章:

python - 在 tkinter 中将单个像素绘制到 Canvas 上

javascript - 用Javascript中设置的字典数组替换字符串中的字母

python - 如何优化编辑距离代码?

c++ - 插入 C++ 映射 STL 容器失败

python - 如何对字典进行排序?

python - Fastai 文本分类器 : batch prediction on unseen data

python - 打印链接到列表中键的字典值

python - 基于两列比较两个数据帧并打印匹配值并对匹配值进行分组

javascript - 类型错误 : Cannot find function forEach in object in Google App Script

ios - 如何使用字典中的键值对为表格 View 单元格提供标题?