首页 > 解决方案 > 为什么列表索引超出范围但似乎没问题

问题描述

为什么在尝试运行此代码时出现“列表索引超出范围”

x = 20
l = [[] for i in range(0, x)]
for m in range(x):
    for i in range(len(l)):
        if i != len(l):
            l[i+1].append(m)

标签: python-3.x

解决方案


for i in range(len(l)):产生包容0len(l) - 1所以i永远不等于len(l),但是当它等于 时len(l) - 1l[i + 1]试图访问l[len(l)]l(alist的索引从0(包括) 到其长度 (不包括)) 中的最高合法索引多一个,所以长度本身永远不是 a有效索引)。

您的测试应该是if i != len(l) - 1:排除i + 1不是合法索引的情况。或者更简单(并且更有效),只需range首先限制,这样您就不需要像当前代码那样添加1和直接跳过索引:0

for m in range(x):
    for i in range(1, len(l)):
        l[i].append(m)

请注意,在这种特定情况下,您可以l使用以下方式构建决赛:

l = [[]] + [list(range(20)) for _ in range(1, x)]

或者没有可能过于密集的 listcomp:

l = [[]]
for _ in range(1, x):
    l.append(list(range(20)))

因为这就是您的代码以某种迂回的方式所做的事情。


推荐阅读