2016-03-08 96 views
3

我的功能是這樣的:爲什麼此代碼在某些情況下會引發IndexError?

輸入:

8 

輸出:

['000', '001', '010', '011', '100', '101', '110', '111'] 

所以這是創建一個列表來存儲input_number二進制數從0 這裏開始是我的代碼(正確版本):

import math 

input_num = 8 
max_bit = math.ceil(math.log(input_num, 2)) 

list_Bin = [None] * input_num 

for i in range(input_num): 
    extra_d = max_bit - len(bin(i)[2:]) 
    list_Bin[i] = '0'*extra_d + bin(i)[2:] 

print(list_Bin) 

這段代碼運行良好。但是,如果我改變代碼的一行:

list_Bin = [None] * input_num 

list_Bin = [] * input_num 

這將引發IndexError。

我真的很想知道爲什麼,因爲我多次遇到這個問題。

回答

1

[None][]之間的差異。 [None]是與一個成員,這是None的列表。但[]是一個空列表,成員。

當你做[None] * input_num你創建一個新列表None成員,多達input_num次。

但是,當你做[] * input_num,沒有成員開始。因此,你仍然有一個空的列表,這自然不能被編入索引。

+0

謝謝你的幫助!但是,我可以使用.append來給出空列表值嗎? –

+0

@MarsLee很高興見到你[再](http://stackoverflow.com/questions/35837794/can-someone-explain-this-recursive-for-me)。 ;)是的,一個空列表是一個*列表*,因此你可以附加一個項目,就像其他列表一樣 – Ian

+0

當然!謝謝你昨天幫助我!我完全明白了!謝謝:) –

5

一個空的列表就像0;不管你乘以多少,答案仍然是一個空的列表。

>>> [] == []*8 
True 

而且[][x]將引發IndexError任何價值x

+0

哇!我知道了!這是非常清楚!所以如果我想給空列表值,唯一的方法是.append?我真的很感謝你的回答;) –

+0

是的,一個空的列表就像任何其他列表;它只是沒有任何價值。你可以用len取其長度(和其他列表一樣,一個有效的索引'i'是'0 <= i chepner

相關問題