为何Python for循环中range外层循环先执行两次才进入内层循环?
为什么外层循环先执行两次,内层循环才开始运行?
别被输出的表象骗啦!你看到的「外层循环先跑两次」,其实是第一次外层循环的内层循环根本没执行任何迭代,不是外层真的触发了两次才启动内层。咱来拆解下代码里的关键细节:
首先看你的代码:
def sort(a_list): for i in range(1, len(a_list)): print("i=", i) for j in range(i-1, 0, -1): print("j=", j)
测试用例:
L = [9,6,1,3] sort(L)
核心原因:range()生成空序列导致内层循环跳过
Python的range(start, stop, step)有个规则:如果起始值和结束值的关系不符合步长走向,或者起始值等于结束值,生成的就是空序列,循环不会执行。
- 当i=1时,内层循环的
range(i-1, 0, -1)等价于range(0, 0, -1)——起始值和结束值都是0,所以生成空序列,内层循环直接跳过,没有任何j=的输出,直接进入外层循环的下一次迭代。 - 当i=2时,内层循环变成
range(1, 0, -1),步长为-1,从1往0走(不包含0),生成序列[1],所以内层循环执行一次,打印j=1。 - 当i=3时,内层循环是
range(2, 0, -1),生成[2,1],所以依次打印j=2和j=1。
还原真实的运行顺序(带换行的正常输出)
你的原始运行结果可能是复制时格式错乱了,实际正常运行的输出应该是这样的:
i= 1 i= 2 j= 1 i= 3 j= 2 j= 1
这样就能清晰看到:i=1的外层循环跑完后,因为内层没执行,直接到i=2的外层循环,这时候内层才第一次启动。
内容的提问来源于stack exchange,提问作者David Ma
相关产品推荐
相关产品推荐

