Питон для цикла и словаря
В питоне и тритоне я запутался, почему не могу получить желаемое значение, которое хотел; Я не знаю что не так.
Допустим self.pendingapr
имеет поле itemdescription
и имеют 3 индекса, в целом это имеет small
, medium
, large
в itemdescriptions
, Я действительно не знаю, заключается ли проблема в цикле 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'}
3 ответа
Происходит то, что переменные карты являются ссылками в Python. Таким образом, в каждой итерации, если в цикле вы изменяете все карты M2Mldic2, потому что они все одинаковы.
Я думаю, что ваш код должен быть:
#global M2Mdic
global M2Mldic2
M2Mdic = {}
M2Mldic2 = {}
res = {}
for x in self.pendingapr:
M2Mdic = {}
M2Mdic['itemdescription'] = str(x.itemdescription)
M2Mldic2[x.id] = M2Mdic
Вы помещаете один и тот же объект в каждое значение в M2Mldic2
толковый словарь. Имейте в виду, что объекты обычно передаются по ссылке, вам нужно явно копировать их, когда вы хотите копировать.
for x in self.pendingapr:
M2Mdic = {
'itemdescription': str(x.itemdescription)
}
M2Mldic2[x.id] = M2Mdic
Это создает отдельный словарь для каждого значения в M2Mldic2
,
А зачем вам вообще нужен промежуточный словарь? Это полностью избыточно
M2mDict={}
for x in self.pendingapr:
M2Mldic2[x.id] = str(x.itemdescription)
или более Pythonic путь (из v.2.7)
M2mDict= = {x.id : str(x.itemdescription) for x in self.pendingapr}