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

Python类中字典版本控制异常问题求助

问题原因与解决方案

问题根源

你遇到的问题核心是字典是可变对象:
当你执行po_ = self.po时,并没有创建字典的独立副本——只是把字典的内存引用赋值给了po_。因此history列表中添加的所有元素,实际上都是指向同一个字典的引用。后续修改self.po的内容时,所有历史记录会同步变成最新版本。

修复方案

由于你的字典是嵌套结构,需要使用深拷贝来创建完全独立的字典副本。Python标准库的copy.deepcopy()会递归复制字典的所有层级,确保副本与原字典完全分离。

修复后的完整代码

import copy

test_dict = {'var0':{'var1':{'cond1':1,
                            'cond2':2,
                            'cond3':3}
                    }
            }

class version_control:
    
    def __init__ (self, dictionary):
        # 初始化时深拷贝原字典,避免外部修改影响实例内部数据
        self.po = copy.deepcopy(dictionary)
        self.history = list()
        self.version = 0

    def update_dictionary(self, var0, var1, new_points):
            # 对当前字典做深拷贝,再存入历史记录
            po_copy = copy.deepcopy(self.po)
            self.history.append(po_copy)

            for i in new_points:
                 self.po[var0][var1][i[0]] = i[1]

            self.version += 1
    
    def get_history(self, ver):
        return self.history[ver]

测试代码与输出

a = version_control(test_dict)

new_points = [('cond1', 2),
             ('cond2', 0)]

a.update_dictionary('var0', 'var1', new_points)

new_points = [('cond3', -99),
             ('cond2', 1)]

a.update_dictionary('var0', 'var1', new_points)

print(a.get_history(0))
# 输出:{'var0': {'var1': {'cond1': 1, 'cond2': 2, 'cond3': 3}}}

print(a.get_history(1))
# 输出:{'var0': {'var1': {'cond1': 2, 'cond2': 0, 'cond3': 3}}}

关键说明

  • copy.deepcopy()会遍历字典的所有嵌套层级,生成完全独立的新对象,后续修改原字典不会影响副本。
  • 初始化方法中也加入深拷贝,防止外部修改原始的test_dict时,意外改变实例内部的self.po。

内容的提问来源于stack exchange,提问作者Henri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:20:40