You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类调用后字典值意外被覆盖的问题求助

Python类调用后字典值意外被覆盖的问题求助

兄弟,我太懂你这种踩坑的憋屈感了!明明每次都新建了实例处理不同路径,结果前一个字典的内容居然被后一个给覆盖了,简直摸不着头脑对吧?

问题根源

你踩的是字典引用传递的坑:你定义的info_template是一个全局的字典对象,每次调用createInfoDict方法时,你都是直接修改这个同一个字典,而不是创建它的独立副本。

说白了,files_dict[1]和files_dict[2]其实指向的是内存里的同一个info_template字典,最后一次修改(也就是处理第2组路径的时候)自然会把之前的内容全部覆盖掉。至于你尝试的del Info_c,其实完全没用——因为你删除的只是实例的引用,而字典对象已经被files_dict保存了,而且问题根本不在实例上,在字典的共享引用上。

解决方案:创建字典的独立副本

因为你的info_template是嵌套字典(里面还有一层Files字典),普通浅拷贝(比如info_template.copy())只能复制外层字典,嵌套的子字典还是共享的,所以必须用深拷贝确保所有层级都是新对象。

给你两种修改思路:

思路1:在方法内部深拷贝全局模板

直接在createInfoDict里复制模板,避免修改全局的原始模板:

import copy

info_template = {
    'Files': {
        'FIRST_FILE': "N/A",
        'SECOND_FILE': "N/A"
    }
}

class InfoGenerator:
    def __init__(self, _first_file_path, _second_file_path):
        self.first_file_path = _first_file_path
        self.second_file_path = _second_file_path

    def createInfoDict(self) -> dict:
        # 深拷贝模板,生成完全独立的新字典
        info_copy = copy.deepcopy(info_template)
        info_copy['Files']['FIRST_FILE'] = self.first_file_path
        info_copy['Files']['SECOND_FILE'] = self.second_file_path
        return info_copy

if __name__ == '__main__':
    files = {1: ["FirstPath1", "SecondPath1"], 2: ["FirstPath2", "SecondPath2"]}
    files_dict = dict()
    for file_id, paths in files.items():
        info_c = InfoGenerator(_first_file_path=paths[0], _second_file_path=paths[1])
        files_dict[file_id] = info_c.createInfoDict()
    
    # 现在打印出来就是你想要的结果了
    print(files_dict)

思路2:每个实例自带独立模板

如果不想依赖全局变量,也可以把模板的创建放到__init__里,确保每个实例都有自己专属的字典:

class InfoGenerator:
    def __init__(self, _first_file_path, _second_file_path):
        self.first_file_path = _first_file_path
        self.second_file_path = _second_file_path
        # 每个实例初始化时生成自己的字典模板
        self.info = {
            'Files': {
                'FIRST_FILE': "N/A",
                'SECOND_FILE': "N/A"
            }
        }

    def createInfoDict(self) -> dict:
        self.info['Files']['FIRST_FILE'] = self.first_file_path
        self.info['Files']['SECOND_FILE'] = self.second_file_path
        return self.info

if __name__ == '__main__':
    files = {1: ["FirstPath1", "SecondPath1"], 2: ["FirstPath2", "SecondPath2"]}
    files_dict = dict()
    for file_id, paths in files.items():
        info_c = InfoGenerator(_first_file_path=paths[0], _second_file_path=paths[1])
        files_dict[file_id] = info_c.createInfoDict()
    
    print(files_dict)

验证结果

修改后运行代码,你会得到预期的正确输出:

{1: {'Files': {'FIRST_FILE': 'FirstPath1', 'SECOND_FILE': 'SecondPath1'}}, 2: {'Files': {'FIRST_FILE': 'FirstPath2', 'SECOND_FILE': 'SecondPath2'}}}

备注:内容来源于stack exchange,提问作者Cezar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:54:50