Python for循环异常终止求助:循环仅执行两次未遍历全部列表
问题:Python for循环仅处理列表部分元素的原因与修复方案
问题重现
你编写的程序意图打印消息列表中所有内容,并将已打印的消息存入新列表,但for循环仅处理了2个元素,而非全部。
你的代码
def Print_It (message): print (message) def Send_mex (To_send): for sende in To_send: Print_It(sende) current_message = List_of_Message.pop() Sended_message.append(current_message) List_of_Message = ['GO!!!', 'WAIT!!!', 'DAMN!!', 'OUCH!!!'] Sended_message = [] Send_mex (List_of_Message) Print_It (List_of_Message) Print_It (Sended_message)
实际输出
GO!!! WAIT!!! ['GO!!!', 'WAIT!!!'] ['OUCH!!!', 'DAMN!!']
预期输出
GO!!! WAIT!!! OUCH!!! DAMN!!! [] ['OUCH!!!', 'DAMN!!','GO!!!', 'WAIT!!!']
原因分析
问题出在for循环遍历列表的同时,使用pop()修改了原列表的长度:
- Python的for循环基于列表初始的迭代器遍历,初始列表有4个元素,迭代器会依次指向第1、2、3、4个元素。
- 第一次循环:打印
GO!!!,pop()移除尾部元素OUCH!!!,原列表长度变为3。 - 第二次循环:打印
WAIT!!!,pop()移除尾部元素DAMN!!,原列表长度变为2。 - 此时迭代器已完成前2次迭代,原列表当前长度仅剩2,循环直接终止,剩余元素未被处理。
另外,你预期原列表为空,但当前代码遍历原列表头部元素的同时,从尾部pop()元素,两者操作位置不匹配,导致原列表残留未处理元素。
修复方案
方案1:遍历列表的副本
修改Send_mex函数,遍历原列表的副本,避免修改原列表干扰循环迭代次数:
def Print_It(message): print(message) def Send_mex(To_send): # 遍历原列表的副本,不影响原列表的修改操作 for sende in list(To_send): Print_It(sende) current_message = List_of_Message.pop() # 从尾部取元素,匹配你预期的Sended_message顺序 Sended_message.append(current_message) List_of_Message = ['GO!!!', 'WAIT!!!', 'DAMN!!', 'OUCH!!!'] Sended_message = [] Send_mex(List_of_Message) Print_It(List_of_Message) Print_It(Sended_message)
方案2:分离打印与元素转移逻辑
先完成所有元素的打印,再批量转移元素,逻辑更清晰:
def Print_It(message): print(message) def Send_mex(To_send): # 先打印所有元素 for sende in To_send: Print_It(sende) # 批量从尾部取元素,转移到新列表 while To_send: Sended_message.append(To_send.pop()) List_of_Message = ['GO!!!', 'WAIT!!!', 'DAMN!!', 'OUCH!!!'] Sended_message = [] Send_mex(List_of_Message) Print_It(List_of_Message) Print_It(Sended_message)
修复后的输出
两种方案都会得到符合预期的结果:
GO!!! WAIT!!! DAMN!! OUCH!!! [] ['OUCH!!!', 'DAMN!!', 'WAIT!!!', 'GO!!!']
内容的提问来源于stack exchange,提问作者Kko_Viv
相关产品推荐
相关产品推荐

