【问题标题】:Why does this code raise IndexError in certain situation?为什么此代码在某些情况下会引发 IndexError?
【发布时间】:2016-06-21 20:09:24
【问题描述】:

我的功能是这样的:

输入:

8

输出:

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

所以这是创建一个列表来存储从 0 开始的 input_number 二进制数。 这是我的代码(正确版本):

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。

我真的很想知道为什么,因为我遇到过很多次这个问题。

【问题讨论】:

    标签: python list python-3.x indexing


    【解决方案1】:

    [None][] 之间存在差异。 [None] 是一个包含 一个 成员的列表,即None。但是[] 是一个空列表,其中有 zero 个成员。

    当您执行[None] * input_num 时,您将创建一个包含None 成员的新列表,其数量多达input_num 次。

    但是当你做[] * input_num 时,一开始就没有会员。因此,您仍然有一个自然无法索引的空列表。

    【讨论】:

    • 感谢您的帮助!但是我可以使用 .append 给空列表值吗?
    • @MarsLee 很高兴见到你again。 ;) 是的,一个空列表是一个 list,因此您可以像任何其他列表一样在它后面附加一个项目
    • 绝对!谢谢你昨天帮助我!我完全明白了!谢谢你:)
    • @MarsLee 很棒。 ;) 是的,正如你所说,我们很快又见面了……祝你有美好的一天!
    • 我相信我们很快就会再次见面,因为我还有很多问题哈哈。希望你有一个美好的一天:)
    【解决方案2】:

    空列表就像 0;不管你乘以什么,答案仍然是一个空列表。

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

    [][x] 将针对任何值x 引发IndexError

    【讨论】:

    • 哇!我得到了它!这个超级清楚!所以如果我想给空列表值,唯一的方法是.append?非常感谢您的回答;)
    • 是的,空列表和其他列表一样;它只是没有任何价值。您可以使用 len 获取它的长度(和任何其他列表一样,有效的索引 i0 <= i < len([]) == 0-- 并且没有大于或等于 0 小于 0 的整数)、附加到它 (l = []; l.append(3); l == [3]) 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2012-11-27
    • 2016-06-10
    相关资源
    最近更新 更多