循环遍历 range(0)

3
这是函数内容:
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。然而,我预期会收到“list index out of range error”的错误信息。有人能解释一下为什么会出现这种情况吗?


1
如果您在Python解释器中键入list(range(0)),它将返回[]。因此,您无法迭代空列表。 - Abdul Niyas P M
4个回答

3

range(a, b, s)表示的是从 a 开始,每次增加 s 直到不超过 b 的一个有序数列,其中最后一项 x 满足 x < b

因此,当 range(0) 转化为 range(0,0,1) 时,它会生成一个空的 list。这意味着 for 循环内部被跳过,返回值为 True


谢谢回复!现在清楚了。@RohithS98,你对这种情况的处理方式有什么看法?有更好的解决方案吗? - Nicko
@Nicko 这种方法很好。有一些更短的方法可以实现,比如在这里给出的方法,但基本概念是相同的,并且具有相同的复杂度。 - RohithS98

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

0

它返回True,因为它已经无法进入循环,因为列表是[],也就是空的,所以它只返回其后面的内容。


0
在幕后,for语句对容器对象(此处为range)调用iter()函数。该函数返回一个迭代器对象,定义了方法next(),它逐个访问容器中的元素。当没有更多元素时,next()会引发StopIteration异常,告诉for循环终止。
在您的代码片段中: range(0)意味着循环永远不会运行,相反将引发StopIteration异常。如果是range(0,1),则会得到预期的答案。 因此,它跳到下一条语句并返回true。
您可以在Python文档中了解有关迭代器协议的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接