1 li = [1,2,3,4,5,6] 2 for i in li: 3 if i<3: 4 li.remove(i) 5 print(li)
#輸出的結果是 [2,3,4,5,6] 2沒有remove掉 是因為
#在第一次循環的時候,1 被remove掉了
#然后坑位由6個變為5個
#以后的一次往前排,2到了第一個坑位
#然后在迭代的時候,就是從第二個坑位開始迭代,就是從3開始
#所以2 就這么被忽略了!
解決:
例子一:
我是在做飛機大戰,子彈越界要刪除的時候遇到的這個問題,子彈都保存在bullet_list
可以在 函數 里面定義一個 局部變量 remove_list
在局部變量里定義是因為局部變量只有在調用的時候才有,函數調完的時候remove_list也就沒了,省的自己還要刪除
1 for bullet in self.bullet_list: 2 if bullet.judge(): 3 self.remove_list.append(bullet) 4 for i in self.remove_list: 5 self.bullet_list.remove(i)
這個地方在判斷的時候用.judge()方法,而不是直接對self.y<0進行判斷,也是養成對函數封裝的好習慣,盡量不要對屬性直接進行操作
例子二:
100個人圍成一圈,編號1-100,從1 到M 報號,報到M 的人,退出,知道一圈還剩下M-1個人, 這時候剩下幾個人,最初的號碼是多少
if __name__ == '__main__': people_list = list(range(1,101)) M = int(input('請輸入M:')) count_num = 0 while 1: remove_list = [] for people in people_list: count_num += 1 if t%M == 0: remove_list.append(people) count_num = 0 for i in remove_list: people_list.remove(i) if len(people_list) <= M-1 : for temp in people_list: print(temp) break