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

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

在 Python 中動態填充字典

在 Python 中動態填充字典

慕姐8265434 2022-08-25 16:36:08
我有這個自制的模擬退火算法,用于計算具有N個點數的系統的最低能量。兩點之間的能量計算為1 / r,其中a是兩點之間的距離。我在循環中運行我的代碼,一旦我離開循環,我就會更新字典中的新條目。問題是,在循環中的最后一次運行時,計算機似乎將最后一個條目保存為所有條目。請參閱下面的代碼:def energy_find(number,Ts=T_s,Tf=T_f):    val_dic = {}    c = 0     radius,theta = generate_random(number)    energy,matrix = total_energy(number,radius,theta)    val_dic[0] = []    val_dic[0] = {"radius":radius,"theta":theta,"energy":energy,"energies":matrix}    m = 5 # number of repetitions per given temperature    for i in range(m):        c +=1        old_theta = val_dic[c-1]["theta"]        old_radius = val_dic[c-1]["radius"]        energy= val_dic[c-1]["energy"]        old_energies = val_dic[c-1]["energies"]        new_theta,new_radius,which = moveCharge(number,old_theta,old_radius)        new_energy,enMatrix= recalculate(number,new_radius,new_theta,old_energies,which)        delta_energy = new_energy-energy        newset = [new_radius,new_theta,new_energy,enMatrix]        val_dic = acceptChange(newset,delta_energy,val_dic,c,Ts)                print(val_dic[c]['radius'])    df = pd.DataFrame(val_dic).T    energy = df.energy.min()    index =  pd.to_numeric(df.energy).idxmin()    theta = df.loc[index,"theta"]    radius = df.loc[index,"radius"]    return df,energy,radius,theta,delta,val_dic如您所見,上面有一個pring語句,可以正確打印點狀電荷的徑向位置如何變化。但是,一旦該函數運行:df,energy,radius,theta,delta,dic= energy_find(5)print("stop")print(dic[1]["radius"])輸出為:[3, 4.95, 6, 9, 2][5.05, 4.95, 6, 9, 2][3.0, 4.95, 6, 9, 2][3.0, 4.95, 6, 9, 4.05][5.05, 4.95, 6, 9, 4.05]stop[5.05, 4.95, 6, 9, 4.05]為:print(dic[2]["radius"]) 輸出:[5.05, 4.95, 6, 9, 4.05]沒錯,就像dic[1]一樣,并且等于函數運行時for循環中打印的最后一個值。我是否錯誤地使用了字典?
查看完整描述

1 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

我認為問題是,當你寫這樣的東西時:


old_theta = val_dic[c-1]["theta"]

你沒有復制你所做的前一個θ,old_theta引用同一個對象,如果你進一步改變old_theta它也會改變val_dic[c-1][“theta”]。


您可以使用復制模塊來避免此問題,并按如下方式更改行:


import copy 


old_theta = copy.copy(val_dic[c-1]["theta"])

old_radius = copy.copy(val_dic[c-1]["radius"])

energy= copy.copy(val_dic[c-1]["energy"])

old_energies = copy.copy(val_dic[c-1]["energies"])

那么old_radius將只是前一個半徑的值,而不是同一個對象


查看完整回答
反對 回復 2022-08-25
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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