我對一個我無法弄清楚的問題有點難倒,我覺得這應該是一個微不足道的問題。我有一個班級預算的元素預算。在此類中,它有一個包含 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
提交
取消