1

2つの要素のタプルを持つ10個の要素のリストがあり、各タプルに値を追加したいのですが、次のコードを記述すると、累積合計が計算されるようです。これはどのように起こっていますか。助けてください

# -*- coding: utf-8 -*-
i=0
k=10
count=[]
value=[1,2]
while i < k:
  count.append(value)
  i=i+1
t=[10,2]
i=0
#for item in count:
  #print item
while i <(len(count)):
  count[i][0]+=t[0];
  count[i][1]+=t[1];
  i+=1;

for item in count:
  print item

outpusが出てきます

[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]
[101, 22]

思った通りどこに

[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
[11, 4]
4

3 に答える 3

3

これは、実際には、同じ(単一の)2項目リストへの10個の参照のリストがあるためです。2番目のループで同じリストに繰り返し追加しています。サブリストの新しいインスタンスが本当に必要です(そして、実際に持っているのは、タプルではなく、可変リストです)。

あなたはこれを行うことができます:

while i < k:
  count.append(value[:])
  i=i+1

埋め込まれたリストの新しいコピーを取得します。

于 2012-05-05T04:35:09.873 に答える
2

これを試して:

i=0
k=10
count=[]

while i < k:
  count.append([1,2])
  i=i+1

t=[10,2]
i=0

while i <(len(count)):
  count[i][0]+=t[0];
  count[i][1]+=t[1];
  i+=1;

for item in count:
  print item

問題は次の行にありました。同じ可変参照をリストにcount.append(value)追加し、それを何度も更新し続けていました。[1, 2]count

行をあなたに置き換えることによりcount.append([1,2])、新しい、異なるリストが追加されるたびに確認してください。

ちなみに、コードのどこでもタプル(質問で述べられているように)を使用しておらず、リストのみを使用しています。

于 2012-05-05T04:28:23.963 に答える
0

問題は、Pythonがメモリをどのように使用するかということです。カウントに値を追加するたびに、実際には値のメモリ位置への参照が追加されます。何が起こっているのかというと、ループするたびにt[0]がvalue[0]に追加されているということです。以下のアクションを参照してください(使用したのと同じセットアップ)

n [54]: for i, item in enumerate(count):
print count[i];
count[i][0] += t[0]
print count[i]
....:     
[1, 2]
[11, 2]
[11, 2]
[21, 2]
[21, 2]
[31, 2]
[31, 2]
[41, 2]
[41, 2]
[51, 2]
[51, 2]
[61, 2]
[61, 2]
[71, 2]
[71, 2]
[81, 2]
[81, 2]
[91, 2]
[91, 2]
[101, 2]

代わりに、変数に割り当てずにリストオブジェクト自体[1,2]だけを追加する出力が必要です。

また、enumerate()(Python組み込み)は、ループ内のインデックス番号とアイテムを生成するため、どこでもwhileを使用する必要はありません。

于 2012-05-05T04:44:05.760 に答える