为何两种相似的Python for循环执行结果存在差异?
两种Python列表循环方式的执行差异解析
代码示例与输出
Code 1
>>> L=[0,1,2,3] for i in range(len(L)): print(f"Counter {i}") for j in range(len(L)): print(j) if len(L)==4: L.remove(2) L.remove(3) else: pass
输出:
Counter 0 0 1 2 3 Counter 1 0 1 Counter 2 0 1 Counter 3 0 1
Code 2
>>> L=[0,1,2,3] for i in L: print(f"Counter {i}") for j in L: print(j) if len(L)==4: L.remove(2) L.remove(3) else: pass
输出:
Counter 0 0 1 Counter 1 0 1
差异原因解析
1. for i in range(len(L))的执行逻辑
range(len(L))在循环启动前会被一次性计算完成。初始时L长度为4,range(4)会生成固定的序列[0,1,2,3],这个序列不会因为后续L的修改而改变。所以哪怕内层循环修改了L的长度,外层循环依然会遍历完这4个数值,因此会执行4次。
2. for i in L的执行逻辑
这种循环是直接遍历列表的迭代器。Python在循环开始时会创建列表的迭代器,但迭代器会实时响应列表的动态变化:
- 初始时L是
[0,1,2,3],迭代器先取出第一个元素0,执行外层循环体; - 内层循环中L被修改为
[0,1]; - 当外层循环要取下一个元素时,迭代器会基于当前的列表状态继续遍历,此时列表只剩
0和1,迭代器取出1后就到达了列表末尾,循环终止,因此外层循环仅执行2次。
内容的提问来源于stack exchange,提问作者Iti
相关产品推荐
相关产品推荐

