2009-06-08 67 views
2
a=[] 
a.append(3) 
a.append(7) 

for j in range(2,23480): 
    a[j]=a[j-2]+(j+2)*(j+3)/2 

當我寫這篇文章的代碼,它提供了這樣的錯誤:Python的錯誤

Traceback (most recent call last): 
    File "C:/Python26/tcount2.py", line 6, in <module> 
    a[j]=a[j-2]+(j+2)*(j+3)/2 
IndexError: list assignment index out of range 

能告訴我爲什麼和如何調試呢?

回答

7

更改這行代碼:

a[j]=a[j-2]+(j+2)*(j+3)/2 

這樣:

a.append(a[j-2] + (j+2)*(j+3)/2) 
1

j=2你試圖分配給一個[2],它還不存在。你可能想用append來代替。

0

Python列表必須預先初始化。你需要做一個= [0] * 23480

或者你可以追加,如果你一次添加一個。我認爲預先分配數組可能會更快。

0

Python在分配給元素時不會動態增加數組的大小。您必須使用a.append(element)將元素添加到結尾,或者使用a.insert(i,element)將元素插入到i之前的位置。

1

如果你想調試它,只是改變你的代碼打印出當前索引,當您去:

a=[] 
a.append(3) 
a.append(7) 

for j in range(2,23480): 
     print j # <-- this line 
     a[j]=a[j-2]+(j+2)*(j+3)/2 

但你可能會發現,它的錯誤了第二個訪問a[2]或更高;您只添加了兩個值,但您嘗試訪問第三個和以後的值。

嘗試用字典({})替換您的列表([]);這樣,您可以分配您喜歡的任何數字 - 或者,如果您確實需要列表,請用23479個項目([0] * 23479)對其進行初始化。

3

錯誤的原因是,您正在嘗試(如錯誤消息所述)訪問當前超出範圍的列表部分。例如,假設您創建了一個10人的列表,並且您試圖指定該列表中的第11個人將成爲誰。在你的紙面上,爲另一個人騰出空間可能很容易,但運行時對象,比如Python中的列表,不是那麼寬容。

你的列表開始是空的,因爲這樣的:

a = [] 

然後加2元吧,有了這個代碼:

a.append(3) 
a.append(7) 

這使得列表的大小剛好夠大,保存2個元素,你添加的兩個元素的索引是0和1(python列表是從0開始的)。

在您的代碼中,進一步向下,然後指定從2開始的元素j的內容,並且您的代碼立即爆炸,因爲您試圖說「對於2個元素的列表,請存儲以下值作爲第三要素「。

同樣,像Python中的列表通常不是那麼寬容。

相反,你將不得不做兩件事情之一:

  1. 在某些情況下,你想存儲到現有的元素,或添加新的元素,這取決於索引是否你指定是否可用
  2. 在其他情況下,你總是要添加新元素

在你的情況,你想要做的NBR。 2,這意味着您要重寫這行代碼:

a[j]=a[j-2]+(j+2)*(j+3)/2 

這樣:

a.append(a[j-2]+(j+2)*(j+3)/2) 

這將一個新元素添加到列表中,這是正常的結束,而不是試圖爲元素N + 1分配一個新的值,其中N是列表的當前長度,這是不正確的。

+0

IMO應該是公認的答案。 – bernie 2009-06-08 21:33:10