开篇先说结论:python中
for item in list
退出的判断条件是循环次数等于表长就跳出;
所以,如果在循环的过程中删除元素,可能就会导致提前终止循环。
下面是我个人练习时出现此错误的代码
guests = ['李白', '杜甫', '苏轼']
guest1 = '苏辙'
guest2 = '汪伦'
guest3 = '孟浩然'
guests.insert(0, guest1)
guests.insert(int(len(guests) / 2), guest2)
guests.append(guest3)
print(guests)
for guest in guests:
if len(guests) > 2:
print(guests.pop(0) + "先生,抱歉,人数过多")
print(len(guests))
else:
print(guest + "欢迎你")
del guests[0]
del guests[0]
print(guests)
输出为
[‘苏辙’, ‘李白’, ‘汪伦’, ‘杜甫’, ‘苏轼’, ‘孟浩然’]
苏辙先生,抱歉,人数过多
5
李白先生,抱歉,人数过多
4
汪伦先生,抱歉,人数过多
3
[‘孟浩然’]
显然for循环只执行了三次,这是因为pop指令将元素弹出了,表长减短,执行三次后,循环次数等于表长,所以导致for循环结束
修改后为
# 3-6
guests = ['李白', '杜甫', '苏轼']
guest1 = '苏辙'
guest2 = '汪伦'
guest3 = '孟浩然'
guests.insert(0, guest1)
guests.insert(int(len(guests) / 2), guest2)
guests.append(guest3)
print(guests)
for num in range(0, 6):
if len(guests) > 2:
print(guests.pop(0) + "先生,抱歉,人数过多")
else:
print(guests[num-4] + "欢迎你")
del guests[0]
del guests[0]
print(guests)
用range的方式做循环的时候,首先使num=num1,之后依次加一,判断继续循环条件是num<num2(所以num2不能循环到,num1如果大于等于num2会直接不进入循环)
for num in range(num1,num2)
最后输出为
[‘苏辙’, ‘李白’, ‘汪伦’, ‘杜甫’, ‘苏轼’, ‘孟浩然’]
苏辙先生,抱歉,人数过多
李白先生,抱歉,人数过多
汪伦先生,抱歉,人数过多
杜甫先生,抱歉,人数过多
苏轼欢迎你
孟浩然欢迎你
[]