Python 为什么for循环的行为与while循环的行为不同;“流行音乐”;功能?

Python 为什么for循环的行为与while循环的行为不同;“流行音乐”;功能?,python,python-3.x,for-loop,while-loop,Python,Python 3.x,For Loop,While Loop,我有以下清单: list1=['pic1','pic2', 'pic3'] 下面的循环在列表中循环: n=0 for item in list1: nose= list1.pop(n) print(nose) 输出: pic1 pic2 pic1 pic2 pic3 为什么列表中的最后一项不打印在for循环中,而while循环打印所有三项: n=0 while len(list1)>0: nose= list1.pop(n) print(nose)

我有以下清单:

list1=['pic1','pic2', 'pic3']
下面的循环在列表中循环:

n=0
for item in list1:
    nose= list1.pop(n)
    print(nose)
输出:

pic1
pic2
pic1
pic2
pic3
为什么列表中的最后一项不打印在for循环中,而while循环打印所有三项:

n=0
while len(list1)>0:
    nose= list1.pop(n)
    print(nose)
输出:

pic1
pic2
pic1
pic2
pic3

您可以测试第一个程序,查看它对打印语句的操作:

list1=['pic1','pic2', 'pic3']
    n=0
    for item in list1:
        nose= list1.pop(n)
        print(f'{list1}, item={item}, popped={nose}')
第一次通过循环时,
包含
pic1
,索引0处的值,它将弹出并打印它:

['pic2', 'pic3'], item=pic1, popped=pic1
第二次通过循环,它将打印:

['pic3'], item=pic3, popped=pic2
也就是说,它将循环的索引移动到位置1,现在是
pic3
,因为您在上一次迭代中已经从列表中弹出了一个条目。它从列表中弹出
pic2

现在循环完成了。下一项的索引超出了列表的末尾,因此它将停止


正如在评论中所说的,基本规则是永远不要修改您正在迭代的列表,因为它可能会产生复杂和意外的结果。

我注意到,在下面的代码中,您总是为
pop()
方法传递索引0

list1.pop(n) where n=0
如果不将索引传递给
pop()
,则它将删除列表中的最后一个元素

语法

**list.pop(pos)**
pos=>可选。指定要删除的元素位置的数字,默认值为-1,返回最后一项

在while循环中,由于您将
0
索引传递给
pop()
方法,因此它将始终删除
0
索引处的项,并且列表的长度为3,因此它将打印所有三个项

for item in list1:
    nose= list1.pop()
    print(nose)


while len(list1)>0:
    nose= list1.pop()
    print(nose)

通常,迭代正在修改的集合不是一个好主意。我认为这里发生的是,使用for循环得到的迭代器的内部状态与列表的更改不同步。