尽管访问字典中的单个元素,但在使用 "append" 或 "extend" 时更新整个字典

Entire dictionary being updated when using "append" or "extend", despite accessing a single element in the dictionary

我有一本字典,格式为:

dictionary= {reference:annotation}

引用指的是一个位置,注释包含有关该位置的信息。

我想找到重叠的参考位置,并在出现重叠时更新注释。我要更新的注释由 dictionary["reference"].qualifiers["ID"] 访问(注释包含第二个字典,我可以在其中访问我想要的信息)。 如果我尝试使用以下方法向注释添加另一个 ID:d

dictionary[reference].qualifiers["ID"].extend(["new ID"])

dictionary[reference].qualifiers["ID"].append("new ID")

我字典中的所有参考注释都将使用该新 ID 进行更新。 但是,如果使用基本列表理解来执行此操作,我会得到所需的结果:

dictionary[reference].qualifiers["ID"] = dictionary[reference].qualifiers["ID"] + ["new ID"]

仅更新​​该引用处的注释。谁能解释为什么我使用 "append" 或 "extend" 得到不同的结果?

你给出的第一个例子不工作对我有用:

class Annotation:
    def __init__(self, initial_val):
        self.qualifiers = {'ID': [initial_val]}

an1 = Annotation("foo")
an2 = Annotation("bar")

d = {'ref1' : an1, 'ref2': an2}

print d['ref1'].qualifiers['ID']
print d['ref2'].qualifiers['ID']

d['ref1'].qualifiers['ID'].extend(['new foo'])

print d['ref1'].qualifiers['ID']
print d['ref2'].qualifiers['ID']

结果:

~ mgregory$ python foo.py
['foo']
['bar']
['foo', 'new foo']
['bar']
~ mgregory$ 

我认为您创建注释的方式有问题 - 可能将浅表副本误认为深表副本,或者类似的数据结构陷阱。

您需要 post 无法运行的实际代码。


作为旁注,您描述为理解的代码不是。它只是使用数组运算符 +.