Python遍历列表调用pop()方法未返回预期值问题咨询
问题原因解析
你遇到的问题是在遍历列表的过程中修改(删除)原列表元素导致的,Python的for循环遍历列表时,本质是按索引顺序依次取值:
- 初始列表长度是5,索引依次是
0、1、2、3、4 - 第一次循环:取索引
0的元素,此时执行pop(),默认弹出列表最后一个元素(索引4的korean),添加到新列表,原列表长度变为4,剩余元素是['russian', 'english', 'spanish', 'french'] - 第二次循环:取索引
1的元素,执行pop()弹出索引3的french,添加到新列表,原列表长度变为3,剩余元素是['russian', 'english', 'spanish'] - 第三次循环:取索引
2的元素,执行pop()弹出索引2的spanish,添加到新列表,原列表长度变为2,剩余元素是['russian', 'english'] - 第四次循环本该取索引
3的元素,但此时原列表长度只有2,最大索引是1,循环直接终止,所以最终只得到3个元素。
正确实现方式
如果要实现把原列表所有元素格式化后转移到新列表、清空原列表的需求,可以用以下两种写法:
写法1:遍历原列表的副本,操作原列表
languages = ['russian', 'english', 'spanish', 'french', 'korean'] formatted_languages = [] # 遍历languages的切片副本,避免遍历和修改同一个对象 for a in languages[:]: formatted_languages.append(languages.pop().title()) print(formatted_languages) # 输出:['Korean', 'French', 'Spanish', 'English', 'Russian']
写法2:直接弹出所有元素直到原列表为空
languages = ['russian', 'english', 'spanish', 'french', 'korean'] formatted_languages = [] while languages: formatted_languages.append(languages.pop().title()) print(formatted_languages) # 输出:['Korean', 'French', 'Spanish', 'English', 'Russian']
内容的提问来源于stack exchange,提问作者Ruslan Ali-zade
相关产品推荐
相关产品推荐

