在Python3中将列表中的项作为for循环删除-奇怪的行为

在Python3中将列表中的项作为for循环删除-奇怪的行为,python,python-3.x,for-loop,Python,Python 3.x,For Loop,返回 lst = [1,2,3,4,5] def rem_items(lst): for i in lst: print(lst) time.sleep(1) lst.remove(i) rem_items(lst) 我能理解前两行,但为什么它会删除3而不是2? 为什么它在移除3而不是2,4,5后停止 提前感谢您在迭代列表时正在修改列表。这通常是一件坏事,可能会导致不可预测的结果 有关更多信息,请参见此处: 您在迭代列表时正在修改列表

返回

lst = [1,2,3,4,5]
def rem_items(lst):
    for i in lst:
        print(lst)
        time.sleep(1)
        lst.remove(i)


rem_items(lst)
我能理解前两行,但为什么它会删除3而不是2?
为什么它在移除3而不是2,4,5后停止


提前感谢

您在迭代列表时正在修改列表。这通常是一件坏事,可能会导致不可预测的结果

有关更多信息,请参见此处:

您在迭代列表时正在修改列表。这通常是一件坏事,可能会导致不可预测的结果

有关更多信息,请参见此处:
您正在迭代列表[1,2,3,4,5]并修改其长度。
书写

和写作一样

for i in lst:
    print(lst)
    time.sleep(1)
    lst.remove(i)
内部迭代器持有一个指针,也称为索引,也称为列表中当前项的位置。loop指令在内部调用i=next(lst_iter),直到引发StopIteration异常


在您的情况下,第一次调用next(lst_iter)将返回列表[1,2,3,4,5]的first元素,即1。第二次调用next(lst_iter)返回列表[2,3,4,5]的第二个元素,即3。

您正在迭代列表[1,2,3,4,5]并修改其长度。
书写

和写作一样

for i in lst:
    print(lst)
    time.sleep(1)
    lst.remove(i)
内部迭代器持有一个指针,也称为索引,也称为列表中当前项的位置。loop指令在内部调用i=next(lst_iter),直到引发StopIteration异常

在您的情况下,第一次调用next(lst_iter)将返回列表[1,2,3,4,5]的first元素,即1。第二次调用next(lst_iter)将返回列表[2,3,4,5]中的second元素,即3

lst_iter = iter(lst):
for i in lst_iter:
    print(lst)
    time.sleep(1)
    lst.remove(i)