python列表操作,刪除總是失敗

昨天和今天,調試,怎麼弄都出不來,其實很簡單的需求,就是兩個列表A和B ,A裏面有2個值,B裏邊有5個值, 如果列表B中含有A的值,那麼從列表B中踢出去,得到一個新B

代碼如下

  if uuids is not None and len(servers_list)!=0:
            for i, s in enumerate(servers_list):
                if not s['uuid'] in uuids:
                   servers_list.remove(s)

看起來沒有任何問題, 然而,最後的結果怎麼都是3個元素,就是不是我想要的2個元素,我調啊,調啊,然後各種打印,都快吐血了。然後我用fori 去遍歷,操作。

  if uuids is not None and len(servers_list)!=0:
            for i in range(len(servers_list)):
                if not servers_list[i]['uuid'] in uuids:
                   servers_list.remove(i)

 

報出來一個列表越界錯誤 ,然後我想起來一個問題,我是在操作同一個列表,然後呢,他的長度就不對了,肯定越界了。 

然後我指定一個新的列表 = servers_list,然後操作新的列表,發現最後還是操作的servers_list. 反正是怎麼都不對,各種打印,輸出。

最後發現一個問題是,在利用enumerate的時候,總是最後一個值無法刪除,條件判斷是對的。然後就猜測一下, 最有可能他在遍歷的時候這個 i 出現了問題。 然後加上索引i越界,明白了一個問題,從servers_list中根據對象刪除 ,不是根據索引 i 刪除的時候,我們應該做一個copy ,然後根據copy到的新的列表,去操作servers_list ,這樣也不會有索引 i 越界的問題, 刪除的時候也不會出現問題了。然後單元測試通過。

  servers_list_iter = servers_list[:]
  if uuids is not None and len(servers_list) != 0:
      for i, s in enumerate(servers_list_iter):
          if not s['uuid'] in uuids:
              servers_list.remove(s)

 

python小白 今天犯了一個錯誤, 謹記!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章