2012-07-04 5 views
0

Я пытаюсь обновить значения в списке списков, используя следующий исходный код:Python + Django - значение Обновления в списке списков

target_agreement = get_object_or_404(TargetAgreement.objects, pk=agreement_id) 
target_category_set = TargetCategory.objects.filter(company=target_agreement.company, is_active=True).order_by('position') 

category_targets = [] 
if target_category_set: 
    totals = [[0]*3]*len(target_category_set) #list of lists with list on level 2 having length of 3 
else: 
    totals = [[0]*3]*1 

for (index1,target_category) in enumerate(target_category_set): 
     category_targets_temp = [] 

     for (index2,target) in enumerate(target_category.category_targets.filter(user=request.user, agreement=target_agreement)): 
      category_targets_temp.append(target) 
      print "*******" 
      print "index is: " 
      print index1 
      print totals[index1][0] 
      totals[index1][0] = totals[index1][0] + target.weight 
      print totals[index1][0] 
      print "totals are" 
      print totals 
      print "*******" 
     print "final result" 
     print totals[index1][0] 
     print totals 
     print "-----" 
     category_targets.append(category_targets_temp) 
    print totals 

поведение я не понимаю, что totals[index1][0] = totals[index1][0] + target.weight не только обновляя первый элемент в списке, на который ссылается index1, но все первые элементы во всех списках.

В результате, как следующее:

[[88, 0, 0], [88, 0, 0], [88, 0, 0], [88, 0, 0]] 

Но я бы ожидал:

[[36, 0, 0], [50, 0, 0], [1, 0, 0], [1, 0, 0]] 

Может кто-нибудь прояснить, что я сделал неправильно. Спасибо за вашу помощь.

ответ

2

Причина в том, как вы создали этот список totals. При умножении списка -

totals = [[0]*3]*len(target_category_set) 

Вы создаете список, элементы которого являются ссылками на тот же список. Таким образом, при изменении одного элемента все они модифицируются. Рассмотрим:

In [1]: l = [[1, 2]]*3 

In [2]: l 
Out[2]: [[1, 2], [1, 2], [1, 2]] 

In [3]: l[0].append(3) 

In [4]: l 
Out[4]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 

Но вы могли бы избежать этого, изменив определение списка:

In [5]: l = [[1, 2] for _ in range(3)] 

In [6]: l[0].append(3) 

In [7]: l 
Out[7]: [[1, 2, 3], [1, 2], [1, 2]] 
+0

омг .... Спасибо! :) –

Смежные вопросы