Python 3.x中for循环内while循环无法修改for循环i值的问题
问题解析:for循环迭代变量的赋值逻辑
这是个新手很容易踩的典型坑——for循环的迭代变量会在每次循环开始时被重新赋值,完全不受你在循环体里修改它的影响。咱们一步步拆解代码的执行流程,你就能明白为什么会出现重复的1 0了:
代码执行的详细步骤
初始数组 A = [0,0,-1,0],len(A) 是4,所以外层for循环的迭代序列是 range(4),也就是 [0,1,2,3]。
第一次for循环迭代:
- for循环把序列里的第一个值
0赋给i - 进入while循环:
i=0 <4且A[0]=0 >=0,满足条件,打印0 0,然后i自增为1 - 继续while循环:
i=1 <4且A[1]=0 >=0,满足条件,打印1 0,i自增为2 - 再次检查while条件:
A[2]=-1 <0,不满足,退出while循环 - 回到for循环,准备取下一个迭代值
- for循环把序列里的第一个值
第二次for循环迭代:
- for循环不管你刚才把
i改成了2,直接把序列里的第二个值1赋给i(这就是你疑惑的核心点!) - 进入while循环:
i=1 <4且A[1]=0 >=0,满足条件,打印1 0,i自增为2 - 检查while条件:
A[2]=-1 <0,退出while循环 - 回到for循环,取下一个迭代值
- for循环不管你刚才把
第三次for循环迭代:
- for循环把序列里的第三个值
2赋给i - 进入while循环:
A[2]=-1 <0,不满足条件,直接退出while,没有打印 - 回到for循环,取下一个迭代值
- for循环把序列里的第三个值
第四次for循环迭代:
- for循环把序列里的第四个值
3赋给i - 进入while循环:
i=3 <4且A[3]=0 >=0,满足条件,打印3 0,i自增为4 - 检查while条件:
i=4不小于4,退出while循环 - for循环结束
- for循环把序列里的第四个值
核心结论
Python里的for循环是迭代器驱动的:它会预先从可迭代对象(比如这里的range(4))里取出所有要迭代的值,每次循环开始时就把下一个值硬塞给迭代变量i,不管你在循环体里对i做了什么修改。如果想要让循环体里的i修改影响后续流程,你应该用while循环来实现外层逻辑,而不是嵌套while在for里面。
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

