我对一个我无法弄清楚的问题有点难倒,我觉得这应该是一个微不足道的问题。我有一个班级预算的元素预算。在此类中,它有一个包含 Section 类对象的字典节。在章节类中,我有另一个字典,称为津贴类对象的津贴。在“津贴”类中,我有一个名为“操作”的列表,我想向其添加操作类对象。层次结构如下,对于那些更直观的:预算 -> 款次 -> 津贴 -> 业务我想将操作类对象附加到节和允许的特定组合(使用的变量name_of_section和name_of_operation。我的第一次尝试是budget.sections[name_of_section].allowances[name_of_allowance].operations.append(Operation(name=name, cost=cost, date=date)由于某种未知的原因,它将操作对象添加到我的所有部分和允许元素,我无法弄清楚原因。我尝试将方法add_operation()添加到 Section,该方法使用add_operation()到“津贴”的方法,但它只是不断将每个操作添加到我的所有节和津贴元素中。最奇怪的是,我在津贴中还有一个列表关键字,它意味着一个字符串列表。我稍后以完全相同的方式附加一个字符串:budget.sections[name_of_section].allowances[name_of_allowance].keywords.append(keyword_str)它只会增加适当的部分和津贴。有没有人知道为什么当我尝试将我的操作对象附加到列表中时,它会添加到所有列表中,尽管当我附加到str列表时,它只会添加到单个和适当的列表中?这是我的预算初始化和添加津贴的方法,该津贴根据需要添加一个部分。def __init__(self): self.sections = {"Income": Section(name = "Income")} self.total_balance = 0.0 self.unsorted_operations = []def add_allowance(self, name, section, projected_cost = 0.0, frequency = "monthly"): if section in self.sections: self.sections[section].new_allowance(name=name, section=section, projected_cost = projected_cost, frequency = frequency) else: self.add_section(name = section) self.sections[section].new_allowance(name=name, section=section, projected_cost=projected_cost, frequency=frequency)我的 Section 类以这种方式初始化,_new_allowance()_ 方法是:def __init__(self, name): self.name = name self.allowances = dict() self.calculate_projected_cost()def new_allowance(self, name, section, projected_cost, frequency = 'monthly'): self.allowances[name] = Allowance(name = name, section = section, projected_cost = projected_cost, frequency = frequency) self.calculate_projected_cost()
2 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
事实证明,这可能是我保存的JSON文件的问题,我从中加载了我的对象。正如J_H建议使用的,这些元素是相同的。这个提示在调试我的问题时非常有用。budget
id(x)
在没有对代码进行任何更改的情况下,并且从头开始而不是加载我的JSON文件,我没有再次看到这种行为。我保存了它,停止了程序,再次运行它并加载了我新保存的文件,现在,它正在按预期运行。
墨色风雨
TA贡献1853条经验 获得超6个赞
我不知道你是如何创建数据结构的,因为你没有发布那个代码。
但是你的症状清楚地表明你做了这样的事情:
>>> a = ['apple']
>>> fruit = [a, a, a]
>>> a.append('banana')
>>> fruit
[['apple', 'banana'], ['apple', 'banana'], ['apple', 'banana']]
也就是说,您有一个内部可变容器(或类似对象),并且您的外部容器具有对该单个内部容器的多个引用。假设您显示外部容器。现在,您更改了内部容器(如上所示),这将影响多个位置的显示输出,因为您有多个对更改内容的引用。a
如果您对细节感到好奇,可以使用例如 以查看元素是相同还是不同。python函数大致相当于一个C程序,询问在哪个地址进行存储以进行分配。print(list(map(id, fruit)))id(x)x
添加回答
举报
0/150
提交
取消