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

我对一个我无法弄清楚的问题有点难倒,我觉得这应该是一个微不足道的问题。


我有一个班级预算的元素预算。在此类中,它有一个包含 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()



动漫人物
浏览 73回答 2
2回答

明月笑刀无情

事实证明,这可能是我保存的JSON文件的问题,我从中加载了我的对象。正如J_H建议使用的,这些元素是相同的。这个提示在调试我的问题时非常有用。budgetid(x)在没有对代码进行任何更改的情况下,并且从头开始而不是加载我的JSON文件,我没有再次看到这种行为。我保存了它,停止了程序,再次运行它并加载了我新保存的文件,现在,它正在按预期运行。

墨色风雨

我不知道你是如何创建数据结构的,因为你没有发布那个代码。但是你的症状清楚地表明你做了这样的事情:>>> 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python