Не могу разобраться с ситуацией. На мой взгляд крайне странная.
Разобрал все строковые функции на форы и иф, чтобы понятнее было, но ничего не выходит. Итак:
Начало процедуры, делаю присвоение
zero_offs = {}
for of in offs:
zero_offs[of.code]=0
Получаю
zero_offs = {u'B':0, u'S': 0, u'W': 0}
Использую эту штуку для присовения одному из ключей словаря:
for key, value in o_h.iteritems():
if not key in o_list:
o_list[key] = {
'from':...,
'to':...,
'client': ...,
'cargo_name': ...,
'of_segments': zero_offs,
}
На этом моменте все хорошо - нулевое и т.д.
То есть, при использовании процедуры:
zyx = []
for k, v in o_list.iteritems():
zyx.append((k, v['of_segments']))
получаю:
zyx
[(u'W201503006', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503007', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503004', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503005', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503002', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503003', {u'B': 0, u'S': 0, u'W': 0}),
(u'W201503001', {u'B': 0, u'S': 0, u'W': 0}),
(u'B201503001', {u'B': 0, u'S': 0, u'W': 0}),
(u'B201503003', {u'B': 0, u'S': 0, u'W': 0}),
(u'B201503002', {u'B': 0, u'S': 0, u'W': 0})]
И вот тут начинается полтергейство:
Если вставить в код после всего этого
for o in orders.filter(deal_number__in = o_h.keys()) :
of_segments = o_list[o['deal_number']]['of_segments']
#of_segments[o['of_code__code']] = o['p_sum']-o['costs_sum']
of_segments[o['of_code__code']] = 1
Я получаю странный цикл - значение of_segments улетает в прошлое и вот такую штуку я получаю для переменной
zyx
[(u'W201503006', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503007', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503004', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503005', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503002', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503003', {u'B': 1, u'S': 0, u'W': 1}),
(u'W201503001', {u'B': 1, u'S': 0, u'W': 1}),
(u'B201503001', {u'B': 1, u'S': 0, u'W': 1}),
(u'B201503003', {u'B': 1, u'S': 0, u'W': 1}),
(u'B201503002', {u'B': 1, u'S': 0, u'W': 1})]
И ВНЕЗАПНО
zero_offs
{u'B': 1, u'S': 0, u'W': 1}
Не менялись никакие исходные данные.
Нет циклов лишних где-то или вызовов самого себя. Получается, что я работаю все время с одним и тем же словарем, котрый и zero_offs, и of_segments и o_list[o['deal_number']]['of_segments'] в любых комбинациях. Меняя что-то в "потомке", я до самого верха получаю изменение и один и тот же словарь.
Зануление в цикле не помогает.
Единственное, что помогает - это делать так:
def get_zero_offs(request):
offs = check_offs(request.user.id).exclude(o_type__in = ['F', 'T'])
return {k.code:0 for k in offs}
и вот вместо
'of_segments':zero_offs,
делать
'of_segments': get_zero_offs(request)
Где я чего-то совершенно не понимаю?