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

