Python中,为什么说for是一种遍历列表的有效方式,但是不建议在for循环中修改列表,否则将导致python难以跟踪其中的元素

直接上代码演示。对这个list进行操作。a = [1, 2, 3, 4, 5, 6]
首先,将里面值为3的元素修改为4。我们可以写成这样。

for i in range(len(a)):
    if a[i] == 3:
        a[i] = 4或者这样for i, v in enumerate(a):
    if v == 3:
        a[i] = 4

结果变成了这样:

a = [1, 2, 4, 4, 5]

好像用for循环完成得挺顺利的,但是列表的修改,不仅限于对值得修改,还有插入和删除。接着上一步,我们现在要尝试删除里面所有值为4的元素。

for i, v in enumerate(a):
    if v == 4:
        del a[i]

然而,得到却是

a = [1, 2, 4, 5]

如果写成这样

for i in range(len(a)):
    if a[i] == 4:
        del a[i]

python直接就报错了
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range

由于在遍历的过程中,删除了其中一个元素,导致后面的元素整体前移,导致有个元素成了漏网之鱼。同样的,在遍历过程中,使用插入操作,也会导致类似的错误。这也就是问题里说的无法“跟踪”元素。如果使用while,则可以在面对这样情况的时候灵活应对。同样是上面那个例子。

i = 0
while i < len(a):
    if a[i] == 4:
        del a[i]
    else:
        i += 1

----------------------------------------------------------------------for循环还是很好用的,但是涉及到列表的插入删除,还是不要用了。

最后修改:2020 年 10 月 11 日
如果觉得我的文章对你有用,请随意赞赏