不要在遍历列表时删除元素

有一个比较少见的 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]