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
相关产品推荐
相关产品推荐

