当我们删除列表中的某个元素x,会造成两个结果:
- list的长度变化。
- x后面的元素的index都会变化。
但是我们循环时,使用的list的长度是定值,并不会在每次循环后更新,导致程序异常。无论是在Java还是Python中,这个坑本人已经踩过很多次。
错误的方式千奇百怪,但都是上述原因造成,不再详述,这里只记录正确的删除方式。
1.正向删除,每次删除第一个
if __name__ == '__main__':
list_a = [1, 2, 3, 4, 5]
# list_a的长度
l = len(list_a)
for i in range(l):
#以下三种方式均可,pop有返回值
#list_a.pop(0)
# del(list_a[0])
list_a.remove(list_a[0])
print(list_a)
'''
输出结果为:
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
'''
2.使用pop
,每次删除最后一个
if __name__ == '__main__':
list_a = [1, 2, 3, 4, 5]
# list_a的长度
l = len(list_a)
for i in range(l):
list_a.pop()
print(list_a)
'''
输出结果为:
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
'''
总结:
为了克服上述两个原因我们注意两点:
- 总删除次数固定。
- 每次只删除最后一个或者第一个,解决了元素的下标改变的问题。
- 关于
del remove pop
的使用详见我的另一篇博客Python中pop remove del的区别。