不要在遍历列表时删除元素
有一个比较少见的 bug:通过 for 循环对一个字典进行遍历的时候,如果向字典中增加新元素,就会导致报错。如下:
d ={"a":1,"b":2}
for i in d:
d["c"] = 3
print(i)
输出:
a
Traceback (most recent call last):
File "c:\Users\11828\OneDrive\����\test.py", line 2, in
for i in d:
RuntimeError: dictionary changed size during iteration
报错的意思是说,字典的大小不允许在遍历时更改。
列表则不会有这个问题,你可以一边遍历一边添加元素:
x = [1,2,3]
for i in x:
if i ==1:
x.append(4)
print(i)
输出:
1
2
3
4
但是!如果你在遍历列表的过程中删除元素,则会导致其中元素被跳过:
x = [1,2,3,4]
for i in x:
if i ==2:
x.remove(i)
print(i)
输出:
1
2
4
上面的例子中,元素 2 在遍历时被删除,导致后面的元素 3 被跳过。
所以,不要在遍历列表的同时删元素,这样可能会导致你漏删。如果要删,通常都是在遍历时把符合条件的元素加到另一个列表 b 中,然后再根据列表 b 的结果来删除原列表中对应的元素。
x = list(range(1,10))
for i in x:
if i < 5:
x.remove(i)
print("直接删除的结果:",x)
x = list(range(1,10))
y = []
for i in x:
if i < 5:
y.append(i)
for i in y:
x.remove(i)
print("正确的结果",x)
输出:
直接删除的结果: [2, 4, 5, 6, 7, 8, 9]
正确的结果 [5, 6, 7, 8, 9]