2

Python の for ループで奇妙な動作が発生しています。問題はこれとまったく同じではありませんが、次のように非常に似ています:

a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(b)
     b[3] += 1

結果は次のとおりです。

a = [[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14]]

私が期待している結果は

a =  [[1,2,3,4],[1,2,3,5],[1,2,3,6],[1,2,3,7],.....,[1,2,3,14]]

各反復で b[3] が 14 まで追加され、リスト [1,2,3,14] が a に追加される理由はわかりません。b[3] は、反復ごとに 1 だけ増加する必要があると思います

4

3 に答える 3

7

あなたの問題は、反復ごとに同じ配列への参照を追加し、それを変更し続けることです。

最も簡単な修正は、追加を次のように変更することです

 a.append(list(b))

これにより、すべての反復で、参照の代わりに (浅い) コピーがターゲット配列に追加されます。

于 2012-06-20T11:17:53.323 に答える
4

b参照によってアクセスされるため、変更するb[3]と、何度も追加したすべての参照に影響します abこれを修正するには、毎回の新しいコピーを作成するだけです:

a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(b[:])
     b[3] += 1
于 2012-06-20T11:18:52.620 に答える
2

あなたが使用することができますdeepcopy:

from copy import deepcopy
a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(deepcopy(b))
     b[3] += 1
于 2012-06-20T11:33:25.077 に答える