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循环得到的迭代器的内部状态与列表的更改不同步。