循环超出范围(0)

时间:2018-07-03 06:49:40

标签: python for-loop range

以下是函数:

def is_sorted(L):
    """ (str) -> Bool

    Return True iff the L is sorted in nondecreasing order. Otherwise, return
    False.

    >>> is_sorted([1, 2, 3, 3])
    True
    >>> is_sorted([3, 2, 1, 3])
    False
    """
    if len(L) == 0:
        return False

    for i in range(len(L) - 1):
        if L[i] > L[i + 1]:
            return False

    return True

然后我在一个字符列表上执行了它,并返回True。但是,我希望收到“列表索引超出范围错误”。谁能解释为什么它会有这种行为?

4 个答案:

答案 0 :(得分:3)

range(a,b,s)[a,a+s,a+2*s...,x],其中x < b

因此range(0)-> range(0,0,1)生成一个空的list。这意味着for循环的内部被跳过,返回True

感谢Ali Shahrivarian进行的编辑

答案 1 :(得分:0)

for i in range(n)意味着我将遍历列表[0,1,2....,n-1]。在您的情况下,range(0)=[](一个空列表)是因为0到0之间没有整数。这就是为什么该代码块无法执行的原因:

for i in range(len(L) - 1): #empty list
    if L[i] > L[i + 1]: #this line is not getting executed
        return False

此行正在执行,并且返回True

return True #this one is getting executed

答案 2 :(得分:0)

它返回True,因为它已经不能进入循环,因为列表为[],该列表为空,因此它只返回其后的内容。

答案 3 :(得分:0)

在幕后,for语句在容器对象(这里是范围)上调用iter()。该函数返回一个迭代器对象,该对象定义了方法 next (),该方法一次访问一个容器中的元素。当没有更多元素时, next ()会引发StopIteration异常,该异常告诉for循环终止。

在您的代码段中: range(0)表示循环将永远不会运行,而将引发stopIteration异常。如果它是range(0,1),您将得到预期的答案。 因此,它跳转到下一条语句并返回true。

您可以在python中阅读有关迭代器协议的更多信息。