无法正确更新嵌套字典

2024-10-02 20:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python 3.8.5

我创建了一些类似这样的对象:

class TestClass:
    def __init__(self, key, value):
        self.key=key
        self.value=value

test1 = TestClass(1, 'a')
test2 = TestClass(2, 'b')
test3 = TestClass(3, 'c')

test_list = [test1, test2, test3]

我想创建一个字典来跟踪此对象中的修改:

object_mapper = {
    'ClassNotRelevant': None,
    'TestClass': None,
    'ClassNotRelevant2': None,
}

test_dict = {test.key: object_mapper for test in test_list}

#output
{1: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None}}

现在,我想为字典中的每个类设置value属性,如下所示:

#expected dictionary
#output
{1: {'ClassNotRelevant': None, 'TestClass': 'a', 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass':'b', 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass':'c', 'ClassNotRelevant2': None}}

我正在努力做到以下几点:

for test in test_list:
    test_dict[test.key]['TestClass']= test.value

但结果是:

{1: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None}}

我尝试了以下不同的解决方案:Updating nested dictionaries when data has existing key

但一切都成功了,我做错了什么


Tags: 对象keytestselfnone字典objectvalue
2条回答

问题就在这里

当你这么做的时候

test_dict = {test.key: object_mapper for test in test_list}

输出为

{1: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None}}

这个{'ClassNotRelevant': None, 'TestClass': None, 'ClassNotRelevant2': None}是与键'1 2 3'对应的同一个对象(object_mapper

因此,当您使用此更新时:

for test in test_list:
    test_dict[test.key]['TestClass']= test.value

这将更新object_mapper对象,以便

第一次迭代后:

{1: {'ClassNotRelevant': None, 'TestClass': 'a', 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': 'a', 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': 'a', 'ClassNotRelevant2': None}}

第二次迭代

{1: {'ClassNotRelevant': None, 'TestClass': 'b', 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': 'b', 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': 'b', 'ClassNotRelevant2': None}}

第三次迭代

{1: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None},
 2: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None},
 3: {'ClassNotRelevant': None, 'TestClass': 'c', 'ClassNotRelevant2': None}}

所以不是

test_dict = {test.key: object_mapper for test in test_list}

使用

test_dict = {test.key: object_mapper.copy() for test in test_list}

它将为每个条目创建shallow_copyobject_mapper对象,而不是将object_mapper对象本身放在那里

下面是解决这个问题的代码。它将为每个迭代创建object_mapper的副本

test_dict = {test.key: object_mapper.copy() for test in test_list}
for test in test_list:
    test_dict[test.key]['TestClass']=test.value
print(test_dict)

相关问题 更多 >