#以下两段代码均企图实现通过循环将一个列表元素逐个转移到第二个列表当中
# 我将通过两段代码分析为甚么for循环不适合这类中途需要更改列表内容的操作
# (对应书《从入门到实践》111)
table1=["a","b","c"]
table2=[]
for a in table1:#该for循环企图遍历列表中每遍历一个元素就删除它并移动到列表2(用del方法)
print(f"we had delete '{a}' in the table1???")#for循环执行与否在于是否完成了遍历
table2.append(a)
del(table1[0])
print(table1)
print(table2)
#然而结果是没能删除与移动列表1中元素“c”,这是因为第一次遍历到第一个元素“a”,第一个元素被删除-
#并且移动;第二遍遍历时候默认遍历索引[1],而此时列表1由于第一个元素被删除,所有余下元素全部左移-
#导致此时遍历到了“c”,而不是“b”,直接跳过了b,然而del方法默认删除0号元素,删除了列表1的“b”,导致-
#“b”元素没能被添加到列表2,却被成功删除了,打印的结果也是混乱不堪,之后更多元素更是一坨乱麻
#从以上教训可知,最好不要在遍历列表中修改列表,会导致许多逻辑错误与输出混乱
#所以我们用while循环代替for循环,再也不用关心列表是否被修改的问题
#——————————————————————————————————————————————————————————————————————————————————————
print("\n\n————————————————————————————————分界线——————————————————————————————————————\n\n")
#——————————————————————————————————————————————————————————————————————————————————————
table3=["a","b","c"]
table4=[]
while table3:#while循环执行与否取决于返回值是True还是False,这里列表非空就是True
temporary1=table3.pop()
print(f"we had delete '{temporary1}' in the table1")
table4.append(temporary1)
table4.reverse()#由于pop方法是从尾巴开始弹出元素的,需要对生成元素予以修改(排序)
print(table3)
print(table4)
【Python初学笔记】为甚么for循环遍历列表时最好不要修改列表
于 2023-09-26 13:47:37 首次发布