为什么python中不建议在for循环中修改列表
1个回答
展开全部
对这个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
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询