Python循环for...item/index的区别


for...item与for...index的区别

for...item:
只能正向循环
item只是当层循环中的一个局部变量,item本身值的变化不会影响到列表
如果删除item将造成被删除item的下个相邻item无法正常的被遍历
这个问题暂时没有想到办法解决 所以如果有数据删除我会用for...index反向遍历
for...index:
可以正反向循环
正向循环跟for...item有同样的问题 解决办法是用while循环
关于while循环和for循环的区别我个人觉得在嵌套循环的时候for循环更加有逻辑性,所以还是推荐反向for循环
反向循环在循环当中如果有数据删除十分有用
具体原理及我的一句话总结(先告诉你,总结的很烂,轻鄙视→_→,欢迎探讨和你的精简总结请留言):
正向循环删除一个元素, 列表中后面的元素往前压, 被删除元素的索引被相邻元素所代替,而遍历索引是正向 1的,所以不但相邻元素不会被遍历而且会引起index超出的异常。

反向循环删除一个元素,列表中后面的元素同样往前压,移动索引的元素都是已经遍历过的,而遍历索引是反向-1的,所以不但不会引起异常而且每个元素都会正常的被遍历。一句话总结,删除元素列表重新拼接的推进方向跟循环方向相反则会引起被删除元素被相邻元素取代,而跳过相邻元素,又因为循环总次数不变引发索引超出异常;方向相同则不影响。
参考资料网页作者画了图示,但我觉得第二张表示的不是很清楚,所以我自己画了两张图示:

正向循环.png

反向循环.png


下面是我意识到这个区别后写的测试代码,附件是代码文件。

参考资料:
https://www.cnblogs.com/banana ... .html
t=['A','B','C','D','E']
t2=t[:]
t3=t[:]
t4=t[:]

for...item循环

for w in t:
    print(w)
    if w == 'C':
        t.remove(w)

D是没有被遍历的

        
print('-'*100)

for...index正向循环

for i in range(0,len(t2)):
    if i<len(t2):
        print(t2[i])
        if t2[i] == 'C':
            t2.pop(i)

D是没有被遍历的

       
print('-'*100)  

while循环

i=0
while i<len(t3):
    print(t3[i])
    if t3[i] == 'C':
        t3.pop(i)
    else:
        i =1
     
print('-'*100)
  

for...index反向循环

最佳方案 代码也是最简单的

for i in range(len(t4)-1,-1,-1):
    print(t4[i])
    if t4[i] == 'C':
        t4.pop(i)

2 个评论

{{{
//亲,请在这里输入代码,记得写明代码注释或思路哦~
}}}
改了,注释符号#怎么显示不出来?

要回复文章请先登录注册

返回顶部