Питон для цикла и словаря

В питоне и тритоне я запутался, почему не могу получить желаемое значение, которое хотел; Я не знаю что не так.

Допустим 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}
Другие вопросы по тегам