我有這個自制的模擬退火算法,用于計算具有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將只是前一個半徑的值,而不是同一個對象
添加回答
舉報
0/150
提交
取消