a = [1,2,3,11,4,15,5,2]
for x in a:
if x%2==1:
a.remove(x)
print(a)
上面代码本以为能输出[2,4,2]
但实际上输出了[2, 11, 4, 5, 2]
这是因为你remove掉一个元素后索引值也减一了,所以循环就会跳过下一个
解决办法:创建一个临时列表b来解决
a = [1,2,3,11,4,15,5,2]
b = a[:]
for x in b:
if x%2==1:
a.remove(x)
print(a)
补充
写for i in range(n)这种循环时本来以为只要i-=1就可以了,但是发现这样会报错,看了一下是这个i不会随len(a)的变化确定终止值,也就是说一开始len(a)=8,那i就一定从0到7,这就导致超出索引范围报错:
a = [1,2,3,11,4,15,5,2]
for i in range(len(a)):
print(len(a))
print(i)
if a[i]%2==1:
a.pop(i)
# a.remove(a[i])
i=i-1
print(a)
但是这点在C++就不一样了,C++可以按照这个i-=1的思路来:
#nums是个vector
for(int i=0;i<nums.size();i++){
if(nums[i]%2==1){
nums.erase(nums.begin()+i);
i--;
}