一个妹子来问我这样一个问题:
x = [1,2,1,2,1,1,1]
for i in x:
if i==1:
x.remove(i)
print(x)
为什么这个打印结果是[2,2,1],不是应该是[2,2]吗?我随便一扫,数组、循环,这不是简单得不能再简单的问题嘛,但是仔细一看,心中一万只草泥马奔腾而过,好家伙,我也懵逼了,我也想问不应该是[2,2]吗?我靠,这怎么也不能给妹子说我也看不懂啊。所以我尝试着先打印出中间结果看一看:
x = [1,2,1,2,1,1,1]
for i in x:
print(i)
if i == 1:
x.remove(i)
print(x)
看到这个结果,心中又是一万只草泥马奔过,为什么打印的i全是1?而且还只循环了4次?百度搜索后发现for循环实际循环的是列表的下标,当第一次循环的时候下标为0,也就是索引为0,此时想x[0]为1,满足条件,移除1,所以x就变成了[2,1,2,1,1,1];第二次循环的时候,索引为1,x[1]也是1,满足条件,x更新为[2,2,1,1,1];第三次循环,索引为2,x[2]为1,同样的,x更新为[2,2,1,1];第四次循环,索引为3,x[3]为1,x更新为[2,2,1]。到这里为止,循环就结束了,再循环就越界了。
这个疑问解决了,那到底应该怎样才能把1全部移除呢?这个方法就多了,简单写两个,废话不多说,直接上代码:
x = [1,2,1,2,1,1,1]
for i in range(x.count(1)):
x.remove(1)
#创建一个副本
x = [1,2,1,2,1,1,1]
x_copy = x.copy()
for i in x_copy:
if i == 1:
x.remove(i)