0

次のソースコードを使用して、リストのリストの値を更新しようとしています。

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]]

誰かが私が間違ったことを明らかにすることができますか?ご協力いただきありがとうございます。

4

1 に答える 1

2

その理由は、そのtotalsリストを作成した方法です。リストを掛けることによって-

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

同じリストへの参照を要素とするリストを作成します。したがって、1つの要素を変更すると、すべての要素が変更されます。検討:

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]]
于 2012-07-04T08:58:27.397 に答える