为了账号安全,请及时绑定邮箱和手机立即绑定

将元素追加到双嵌入式字典将添加到所有父元素

将元素追加到双嵌入式字典将添加到所有父元素

动漫人物 2022-09-27 10:51:33
我对一个我无法弄清楚的问题有点难倒,我觉得这应该是一个微不足道的问题。我有一个班级预算的元素预算。在此类中,它有一个包含 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建议使用的,这些元素是相同的。这个提示在调试我的问题时非常有用。budgetid(x)

在没有对代码进行任何更改的情况下,并且从头开始而不是加载我的JSON文件,我没有再次看到这种行为。我保存了它,停止了程序,再次运行它并加载了我新保存的文件,现在,它正在按预期运行。


查看完整回答
反对 回复 2022-09-27
?
墨色风雨

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


查看完整回答
反对 回复 2022-09-27
  • 2 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信