亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將元素追加到雙嵌入式字典將添加到所有父元素

將元素追加到雙嵌入式字典將添加到所有父元素

動漫人物 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 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號