三个Python for循环示例差异解析:为何部分终止部分不终止?
三个Python循环示例的终止差异解析
示例1:会终止的单循环
def generate_coor(dimension_x,dimension_y): x,y=int(dimension_x/2),int(dimension_y/2) for i in range(0, x + 1): print(x) x=x+1 generate_coor(100,27)
上述代码会终止。
原因
Python的range()函数在循环启动前就会预先生成完整的整数序列。这里初始x是50(100/2取整),range(0, x+1)生成0到50的序列(共51个元素),循环会严格执行51次。哪怕循环内部每次把x加1,也不会改变已经生成的序列,51次迭代完成后循环终止。
示例2:不会终止的嵌套循环
def generate_coor(dimension_x,dimension_y): x,y=int(dimension_x/2),int(dimension_y/2) for i in range(0, x + 1): for j in range(0, y + 1): print(y) y=y+1 generate_coor(100,27)
上述代码不会终止。
原因
外层循环的range(0, x+1)初始生成0到50的序列(51次迭代),次数固定。但内层循环的range(0, y+1)是每次进入内层循环时重新计算的:
- 第一次内层循环:y初始为13,生成0到13的序列(14次迭代),结束后y变成13+14=27;
- 第二次内层循环:y变为27,生成0到27的序列(28次迭代),结束后y变成27+28=55;
- 第三次内层循环:y变为55,生成0到55的序列(56次迭代),结束后y变成55+56=111;
- 以此类推,每次内层循环的迭代次数都会翻倍增长,总执行次数是天文数字,实际永远无法完成全部51次外层循环的内层迭代,因此程序表现为不会终止。
示例3:会终止的嵌套循环
def generate_coor(dimension_x,dimension_y): x,y=int(dimension_x/2),int(dimension_y/2) for i in range(0, y): for j in range(0, y + 1): print(y) y=y+1
上述代码会终止。
原因
外层循环的range(0, y)在启动前生成固定序列:初始y是13,生成0到12的序列(共13次外层迭代)。尽管内层循环每次都会大幅增大y,导致内层迭代次数越来越多,但外层循环的次数是固定的13次。只要完成这13次外层循环的内层迭代(哪怕单次内层循环耗时极长),整个程序就会终止。
核心差异总结
三个示例的本质差异在于**range()的计算时机和循环层级**:
- 单循环场景下,
range()预先生成固定序列,修改循环变量不影响迭代次数,必然终止; - 嵌套循环中,若外层循环次数多,且内层循环的
range()每次动态计算、迭代次数指数级增长,总执行次数趋近于无穷大,程序无法终止; - 若外层循环次数固定且较少,哪怕内层循环迭代次数不断增加,只要完成固定次数的外层迭代,程序就会终止。
内容的提问来源于stack exchange,提问作者CKT
相关产品推荐
相关产品推荐

