Python:将重复字典复制到列表中 - 最后一个字典项被欺骗到所有列表项

标签 python list dictionary

考虑以下因素:

import re
sequence = 'FFFFFF{7}FFFFFF'
patterns = [ ('([0-9a-fA-F]+)', 'Sequence'),
    ('(\\([0-9a-fA-F]+\\|[0-9a-fA-F]+\\))', 'Option'),
    ('({[0-9a-fA-F]+})', 'Range'),
    ('(\\[[0-9a-fA-F]+:([0-9a-fA-F]+|\*)\\])', 'Slice'),
    ('(\\?\\?)+', 'Byte_value_Wildcard'),
    ('(\\*)+', 'Byte_length_wildcard') ]
fragment_counter = 0
fragment_dict= {}
fragments_list = []
while sequence:
    found = False
    for pattern, name in patterns:
        m = re.match (pattern,sequence)
        if m:
            fragment_counter+=1
            m = m.groups () [0]
            fragment_dict["index"]=fragment_counter
            fragment_dict["fragment_type"]=name
            fragment_dict["value"]=m
            print fragment_dict
            fragments_list.append(fragment_dict)
            sequence = sequence [len (m):]
            found = True
            break
     if not found: raise Exception ('Unrecognized sequence')

print fragments_list

每次它到达“print fragment_dict”行时,我都会得到正确的(预期的)输出:

{'index': 1, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}
{'index': 2, 'fragment_type': 'Range', 'value': '{7}'}
{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}

但是,列表项 fragments_list 是最终 dict 的 3 个副本,而不是我期望的每一行:

[{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}]

我假设这是因为 append 引用了字典的实例,而不是复制字典的每个迭代。我查看了使用 list() 函数,但在 dict 项上它只给了我一个 dict 键的列表。

我做错了什么?
我不拘泥于数据类型,我只需要一种方法来为我找到的每个片段保存 3 个数据元素(也许是第 4 个)。

最佳答案

你非常接近。代替 list() 函数,它从任何序列生成一个新的 list(在这种情况下,作为序列的 dict 是一个序列它的键),使用 dict() 函数,它从任何映射生成一个新的 dict

或者,也许更简单,只需使用 copy 方法。

或者,更简单地说,只需将 fragment_dict= {} 移动到循环中,这样您就可以构建一个新的 dict 而不是继续重复使用同一个。

关于Python:将重复字典复制到列表中 - 最后一个字典项被欺骗到所有列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948500/

相关文章:

python - 更改 Django 管理员不活动超时

c# - 从列表中添加对象变量

c# - 有效地找到最近的字典键

python - 在数据框中选择时间窗口

python - 我从 wav 文件中获取峰值频率。但是对于录制的 2 个 channel wav,它不起作用

python - 直方图图像未保存

PYTHON:访问字典中列表列表的元素

c# - 循环获取 PDF 文件

arrays - Json 到数组与数组到字典

python - 将嵌套的花括号变成 dict python