2016-03-08 94 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

相关问题