2011-10-25 9 views
0
size = input('Kirjainmäärä: ') 
kirjaimet = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

ruudukko = [] 
rivi = ['0']*(size*2-1) 

for i in range(0,size): #produce n rows 
    for y in range(0,i+1): #this row needs i+1 letters 
     for z in range(0+i,size*2-1-i): 
      rivi[z] = kirjaimet[size-i] 
    print rivi, i 
    ruudukko.append(rivi) 
print ruudukko 

ようにコードをPythonの追加の奇妙な動作ですか?

['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'] 0 
['E', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'E'] 1 
['E', 'D', 'C', 'C', 'C', 'C', 'C', 'D', 'E'] 2 
['E', 'D', 'C', 'B', 'B', 'B', 'C', 'D', 'E'] 3 
['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'] 4 

input=4 

output= 

DDDDDDD 
DCCCCCD 
DCBBBCD 
DCBABCD 

ので、ここでは、(印刷rivi iは-part)入力= 5と上記のコードの出力の書式の数の行列を生成するはずでした

OKこれまで何もかもが、その後...

[['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E']] 

追加リストruudukko C最後に追加されたオブジェクトでいっぱいになっています!

何が起こっているのですか?

+0

riviは現在、配列を指しているので、配列を追加するには配列オブジェクトを最後の位置に置く必要があります。 1つのリストにまとめる場合は、extend()メソッドを使用します。 – dhable

答えて

2

異なるリストを追加していません。 同じリストを5回追加しています。

あなたは結果にあなたのリストのコピーを追加することによって、それを修正することができます:

ruudukko.append(rivi[:]) 

オンラインで作業、それを参照してください:ideone

+1

この種のバグのため、Pythonでは、ヌルで値が設定されたフルサイズのリストを作成し、それを変更することは珍しいことに注意してください。より一般的には、 'ruudukko'リストでOPがしたように、各行の始めに' rivi = [] 'とz-ループで' rivi.append(kirjaimet [size-i]) 'と言うのが普通です。 –

0

あなたはruudukko 5回リスト内の同じオブジェクトを入れています。したがって、ruudukkoの5つの項目のそれぞれは、実際には同じオブジェクトにバインドされています。

listは変更可能なタイプなので、修正することができ、同じオブジェクトへの参照はすべて変更されているように見えます。もちろん、修正されるオブジェクトは1つだけです。ruudukkoの各アイテムが変更されたかのように見えます。そうでない場合、同じオブジェクトが5回その場所に表示されます。

これを修正するには、ruudukkoに追加するたびに新しいリストオブジェクトを作成する必要があります。これを行う方法の多くは、たとえば、あなたがこのようにそれを行うことができ、があります。

ruudukko.append(list(rivi)) 

私はそのことを考えることができる最も簡単な例は、変更可能なオブジェクトの動作がこれです説明:

>>> a = [0] 
>>> b = a 
>>> b[0] = 1 
>>> a 
[1] 
2

list.append()には、追加されたオブジェクトへの参照が格納されます。あなたのリストにriviという複数の参照をあなたのリストに保存しましたruudukko。当然のことながら、それらはすべて実際には同じオブジェクトなので、オブジェクトを変更すると、そのオブジェクトは参照されるすべての場所で変更されます。

ループのたびに新鮮なriviリストを作成します。

この現象は奇妙なことではありません。 Pythonのチュートリアルでは正常であり、期待されています。

0

あなたはriviを一度だけ宣言し、その値を繰り返し割り当てました。この単一のオブジェクトは変更可能で、外側のリストruudukkoに繰り返し追加されています。オブジェクトは可変であり、コピーしていないので、ruudukkoの各位置の最終値になります。