首页 > 解决方案 > 为什么字典的键进入项目内部?

问题描述

我有一个问题,在我看来这没有意义。我正在定义一个字典并使用它来生成一个列表,其中键是列表的第一个元素。但是当我运行它时,不仅创建了列表,还修改了字典。我需要知道为什么会发生这种情况,以及在不修改字典的情况下我可以通过哪些其他方式来完成此列表。通用代码示例如下:


class report:
    def __init__(self):
        self.dict_content= self.get_dict()
        self.labels = self.get_labels()

    def get_dict(self):

        dict_content = dict(A1 = ['a', 'b', 'c'], A2 = ['d', 'e', 'f'])

        return dict_content

    def get_labels(self):
        
        labels = []
        
        for item in self.dict_content.items():
            new_items = item[1]
            new_items.insert(0, item[0])
            labels.append(new_items)
            
        return labels

在控制台中调用,

r = report()

labels = r.labels
print(labels)
[['A1', 'a', 'b', 'c'], ['A2', 'd', 'e', 'f']]

dict_content = r.dict_content
print(dict_content)
{'A1': ['A1', 'a', 'b', 'c'], 'A2': ['A2', 'd', 'e', 'f']}

如果我评论该行self.labels = self.get_labels()并执行最后的操作,我会得到:

r = report()
dict_content = r.dict_content
print(dict_content)
{'A1': ['a', 'b', 'c'], 'A2': ['d', 'e', 'f']}

我期望它是:

r = report()

labels = r.labels
print(labels)
[['A1', 'a', 'b', 'c'], ['A2', 'd', 'e', 'f']]

dict_content = r.dict_content
print(dict_content)
{'A1': ['a', 'b', 'c'], 'A2': ['d', 'e', 'f']}

怎么了?

标签: pythonlistdictionary

解决方案


for item in self.dict_content.items():
    new_items = item[1]
    new_items.insert(0, item[0])
    labels.append(new_items)

这里,new_items尽管它的名字,不是一个新列表,而是对包含在 中的原始列表的引用dict_content

通过使用它的方法,你修改了这个列表,这在稍后insert查看时会有所体现。dict_content

您不想修改原始列表,而是要创建一个新列表。例如,通过串联:

for item in self.dict_content.items():
    new_items = [item[0]] + item[1]
    labels.append(new_items)

推荐阅读