代码之家  ›  专栏  ›  技术社区  ›  ababuji

python-indexerror:列表索引超出范围,不应在该范围时引发

  •  1
  • ababuji  · 技术社区  · 6 年前

    不确定这是因为Jupyter笔记本还是因为python处理了异常,但是我和一个朋友解决了一个涉及算法的问题。

    当白板代码时,我使用了python!

    exampleList = ['a', 'b', 'c', 'd', 'e']
    
    for i in range(0, len(exampleList)):
        for j in range(i + 1, len(exampleList)):
            print(exampleList[i], exampleList[j])
    

    基本上,辩论是……这段代码(类似的代码,我用一个简单的例子来说明)涉及两个 for 循环必须引发错误!因为,索引 i 达到 len(exampleList) - 1 ,和索引 j 技术上来说 len(exampleList) 在那一点上, print(exampleList[i], exampleList[j]) 不能工作!它看起来像是在运行代码时,它会完美地打印出来,我认为它可以处理 IndexError: list index out of range 例外!

    我的问题是……这应该是Python中的预期行为吗?因为和我辩论的那个人最后告诉我:“面试的人注意到了这些事情!你必须能解释每一句话。”

    我想知道这部分是如何处理的,所以我可以解释为什么这不会引发错误!

    7 回复  |  直到 6 年前
        1
  •  1
  •   Druta Ruslan    6 年前

    这个 range 函数包含下界,但 独占 上限。

    示例列表包含5个元素。这意味着第一个循环正在运行 range(0,5) ,使最大 i=4 . 使第二个循环的最大值为 range(5,5) ,这是一个空列表。迭代空列表会导致0次迭代。

    >>> exampleList = ['a', 'b', 'c', 'd', 'e']
    >>> len(exampleList)
    5
    >>> range(0, 5)
    [0, 1, 2, 3, 4]
    >>> range(5,5)
    []
    
        2
  •  1
  •   Ian Ash    6 年前

    你误解了 range() 作品。

    Range() 以小于给定停止值的第一个值停止计数,在这种情况下,该值等于 len(exampleList)-1 .

        3
  •  1
  •   Edward Minnix    6 年前

    在您的示例代码中, j 从不等于 len(exampleList) . 你说 j in range(i + 1, len(exampleList)) ,也就是说 J 也总是小于 len(示例列表) . 如果 i+1 >= len(exampleList) ,范围将为空,因为 range(m, n) 哪里 m >= n 总是空的。

    所以这个错误甚至不会被抛出,因为错误的代码永远不会被执行。

        4
  •  1
  •   Magnetron    6 年前

    对于这个例子,我们有len(数组)= .

    第一个循环上的range函数将迭代返回5个值- [0,1,2,3,4] . 这意味着发行号应该是最后一个, ,对吗?

    但实际上,当你试图进入第二个循环时, 范围(4+1,5) 基本上会返回一个空的数字列表,因此它根本不会运行循环的内容。 因此,没有错误。

        5
  •  0
  •   Zach    6 年前

    注意到examplelist[i]从来不是e吗?当第一个for循环命中len(examplelist)-1时,内部循环将失败,因为它正在检查i+1是否小于examplelist的长度(它不是),因此永远不会到达print语句,从而不会引发异常。

        6
  •  0
  •   Eduardo Soares    6 年前

    在最外层循环的最后一次迭代中,j将开始等于len(示例)。因此,这个迭代中甚至没有执行j循环。因为范围在len(example)和len(example)-1之间。

        7
  •  0
  •   Jack Walsh    6 年前

    这对python来说不是错误的。只有在尝试访问时,异常才会变得令人担忧 exampleList[5] 循环从未请求过。记住这点很重要 range() 不包括上限,但包括下限。

    下面我在解释权上添加了一些评论。

    exampleList = ['a', 'b', 'c', 'd', 'e']
    
    for i in range(0, len(exampleList)): # includes [0, 1, 2, 3, 4]
        for j in range(i + 1, len(exampleList)): # includes all numbers in range[0,4] greater than i
            print(exampleList[i], exampleList[j]) # will never exceed 4