昨天和今天,調試,怎麼弄都出不來,其實很簡單的需求,就是兩個列表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小白 今天犯了一個錯誤, 謹記!