2017-07-10 56 views
2

我也不太明白,爲什麼這不起作用:爲什麼這個列表理解拋出一個超出範圍的錯誤

seq_ls = [s0] 
seq_ls.extend([((j*seq_ls[x-1] + k)%l) for x in range(1,100,1)]) 

但確實:

seq_ls = [s0] 
for x in range(1,100,1): 
    seq_ls.append(((j*seq_ls[x-1] + k)%l)) 

第一套代碼給我一個

IndexError: list index out of range

+0

因爲在第一種情況下,直到列表理解序列結束時,「seq_ls」不會改變其大小。 – zwer

回答

2

嘗試刪除[]的:

seq_ls.extend(((j*seq_ls[x-1] + k)%l) for x in range(1,100,1)) 

當你寫:

seq_ls.extend([((j*seq_ls[x-1] + k)%l) for x in range(1,100,1)]) 

你實際上是在建築上的所有元素的列表,然後通過該擴展。一旦x達到2,這將失敗,因爲沒有元素seq_ls[2-1],因爲它還沒有被添加到seq_ls

但是,如果刪除括號,則擴展的參數將成爲生成器表達式。在這種情況下,單個元素並不是全部預先構建,而是一次只能構建一個元素,因爲它們傳遞給seq_ls.extend。在這種情況下,您的索引應該工作,因爲每個x-1 th元素已被添加。

0

,如果你看一下評估順序,extend呼叫之前,您的列表理解評估:

[((j*seq_ls[x-1] + k)%l) for x in range(1,100,1)] 

這顯然不能工作,因爲在這一點上,只有seq_ls[0]

你的第二個代碼示例是迭代:每個後繼元素不僅計算前一個,也是其添加到列表中後計算。

-1

列表理解是渴望評估,您可以使用生成器表達式來替換它。生成器表達式是懶惰評估。

相關問題