以下是函数:
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。但是,我希望收到“列表索引超出范围错误”。谁能解释为什么它会有这种行为?
答案 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中阅读有关迭代器协议的更多信息。