2011-10-25 63 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追加的奇怪行爲?

input=4 

output= 

DDDDDDD 
DCCCCCD 
DCBBBCD 
DCBABCD 

所以這裏的與輸入= 5上面的代碼的輸出(印刷RIVI,我-part)

['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 

所有目前爲止,但然後..

[['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當前指向一個數組,因此追加數組涉及到將數組對象放在最後位置。如果您想要將其拼合成單個列表,請使用extend()方法。 – dhable

回答

2

您不會追加5個不同的列表到您的結果。您正在追加相同的列表五次。

您可以通過附加您的列表的副本到結果修復:

ruudukko.append(rivi[:]) 

看到它聯機工作:ideone

+1

請注意,由於這種錯誤,在Python中創建填充了空值的全尺寸列表然後進行變異是很不尋常的。比較常見的是在每一行開始時說'rivi = []',在z循環中說'rivi.append(kirjaimet [size-i])',就像OP在'ruudukko'列表中做的那樣。 –

0

你把相同的對象列表ruudukko五倍。因此,ruudukko的5個項目中的每一個實際上都綁定到相同的對象。

因爲list是一個可變類型,所以您可以對其進行修改,並且對同一對象的其他引用也會被修改。當然,它只是一個被修改的對象,它只是看起來好像ruudukko中的每個項目都已被修改。情況並非如此,同一個對象在那裏出現五次。

爲了解決這個問題,您需要在每次追加到ruudukko時創建一個新的列表對象。有很多方法可以做到這一點,例如,你可以做這樣的:

ruudukko.append(list(rivi)) 

最簡單的例子,我能想到的,說明可變對象的行爲是這樣的:

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

list.append()存儲對附加對象的引用。因此,您在列表ruudukko中存儲了多個對列表rivi的引用。當然,因爲它們實際上都是同一個對象,所以當您更改一個對象時,它會在所引用的任何位置發生更改。

每次在您的循環中創建一個新的rivi列表。

這種行爲並不奇怪;這是正常的和預期的,應該在任何像樣的Python教程中介紹。

0

您只宣佈rivi一次,然後重複重新分配其值。你有這個單一的對象,這是可變的,反覆附加到你的外部列表ruudukko。由於該對象是可變的,並且您不復制它,所以最終在ruudukko中的每個位置都會得到最終值。