Python-IndexError:列表索引超出范围时不应该抛出

时间:2018-07-17 13:33:06

标签: python python-3.x index-error

不知道这是因为Jupyter Notebook还是仅仅是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 个答案:

答案 0 :(得分:1)

您误解了range()的工作方式。

Range()停止从小于给定停止值的第一个值开始计数,在您的情况下,该值等于len(exampleList)-1

答案 1 :(得分:1)

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)

在示例代码中,var latlng1 = var latlng1 = L.latLng(0, 0); var latlng2 = L.latLng(0, 135); var distance = latlng1.distanceTo(latlng2); // Distance 15011315.09701543 [meter] 决不等于j。您说len(exampleList),这意味着j in range(i + 1, len(exampleList))也将始终小于j。并且,如果为len(exampleList),则范围将为空,因为i+1 >= len(exampleList)的{​​{1}}始终为空。

所以永远不会抛出错误,因为永远不会执行错误的代码。

答案 3 :(得分:1)

在这种情况下,我们有len(array)= 5

第一个循环上的范围函数将迭代返回5个值- [0,1,2,3,4] 。这意味着问题编号应该是最后一个 4 ,对吧?

但是实际上,当您尝试进入第二个循环时, range(4 + 1,5) 实际上会返回一个空白的数字列表,因此不会t完全运行循环的内容。 因此,没有错误。

答案 4 :(得分:0)

请注意exampleList [i]永远不会是e?一旦您的第一个for循环达到len(exampleList)-1,内部循环就会失败,因为它正在检查i + 1是否小于exampleList的长度(不是),因此永远不会到达print语句,从而导致异常不被抛出。

答案 5 :(得分:0)

这对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

答案 6 :(得分:0)

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