2013-04-24 155 views
0

python和tryton 我很困惑,爲什麼我不能得到我想要的期望值;我不知道什麼是錯的。蟒蛇for循環和字典

比方說self.pendingapr有場itemdescription並有3項指標,總有smallmediumlargeitemdescriptions。我真的不知道,如果這個問題的是在for循環:

global M2Mdic 
global M2Mldic2 
M2Mdic = {} 
M2Mldic2 = {} 
res = {} 

for x in self.pendingapr: 
    M2Mdic['itemdescription'] = str(x.itemdescription) 
    M2Mldic2[x.id] = M2Mdic 

當我打印M2Mldic2它給了我

>>> {1:'large',2:'large',3:'large'} 

當我需要/和期待是

>>> {1:'small',2:'medium',3:'large'} 
+0

你好感謝你所有的答案,這減輕了我的心。其實你所有的答案都值得檢查。但我不能..所以我排列你的答覆。謝謝! – Katherina 2013-04-25 12:30:05

回答

1

發生了什麼是地圖變量是Python中的引用。所以在每一次迭代中,如果你正在修改所有M2Mldic2映射的循環,因爲它們都是相同的。

我覺得你的代碼應該是:

#global M2Mdic 
global M2Mldic2 
M2Mdic = {} 
M2Mldic2 = {} 
res = {} 

for x in self.pendingapr: 
    M2Mdic = {} 
    M2Mdic['itemdescription'] = str(x.itemdescription) 
    M2Mldic2[x.id] = M2Mdic 
2

你把相同的對象到每一個值在M2Mldic2字典。請記住,對象通常通過引用傳遞,當需要副本時,需要明確地複製對象。

for x in self.pendingapr: 
    M2Mdic = { 
     'itemdescription': str(x.itemdescription) 
    } 
    M2Mldic2[x.id] = M2Mdic 

這會爲每個值在M2Mldic2中創建一個單獨的字典。

+0

根本不需要M2Mdic! – volcano 2013-04-24 10:38:18

1

爲什麼你需要中級詞典?這是完全多餘的

M2mDict={} 
for x in self.pendingapr: 
    M2Mldic2[x.id] = str(x.itemdescription) 

或更Python的方式(從v.2.7)

M2mDict= = {x.id : str(x.itemdescription) for x in self.pendingapr}