python list remove 删除引用_Python——list列表操作一坑(remove)
問題發生背景:在一個對象被調用多次時候對象存入了列表暫時保存(主流程不能斷開使用了while True),然后實例化了大批對象,具體你可參考打飛機游戲或者坦克大戰發射子彈,每個子彈一個實例,創建的多到一定時候肯定是要釋放的,然后我選擇了在循環操作時候銷毀了對象,結果發現很詭異的是對象總會跳過一部分沒法銷毀;
出問題思路代碼:
#簡單拿列表舉例具體代碼暫不粘貼
list_a = [11,22,33,44,55,66,77,88,99]
for num in list_a:
#此處有其它操作使用num,此處拿print代替
print(num)
if num == 33 or num == 44:
list_a.remove(num)
#猜測一下運行結果,很多人是不是覺得print()哪里可以調用到列表中所有數據,
#還有remove會回收列表中33和44成員,那你就太年輕了,請看結果:
意識到兩個bug了沒?循環后調用怎么沒掉(雖然只是print操作代替的,你可以想象列表里存的如果是存錢或者投資的隊列,是不是很驚喜),然后不是remove回收了嗎?為啥44還躺在哪里,是不是很想象的結果不一樣?
具體分析:
1、列表是有序的,在使用remove方法時候判斷到索引2剛好等于33,然后代碼讓我刪除,于是代碼就刪除了;此時執行完成列表是【11,22, ,44,55,66,77,88,99】;
2、索引位2不能是空吧,因為你沒有append操作呀,原索引位3就填充了索引位2位置沒意見吧,然后此時循環指針在索引位2要進入索引位3操作是不是但是請看執行索引位3循環時候列表是【11,22,44,55,66,77,88,99】;
3、于是第一個bug產生,print時候44哪去了,已經在索引位2了呀,循環說索引位2我已經操作過了,管他誰呢我要操作索引位3了,此時索引位3是55,于是print調用結果肯定就是:11,22,33,55,66,77,88,99 ——44順利的被忽略了吧;
4、于是這就不難解釋第二個bug了,因為你現在是第三索引位循環判斷取得值都是55,你讓我判斷是不是等于33或者等于44,我做了沒肯定是做了,索引位3是55(此時索引位2才是44,而且索引位2剛才已經判斷過了憑啥讓我做兩次上邊for循環都沒搞,我才不干呢)此時順利的保留了44在列表中,最終列表結果是:【11,22,44,55,66,77,88,99】最終給你了,此時拿到操作后數據是不是很郁悶;
解決思路推薦:
1、定義新的列表,不要在循環中對同一個列表中數據刪除操作;
2、判斷符合條件列表的數據添加到列表;
3、循環要刪除元素列表,刪除其它列表數據;
具體如下:
至此問題順利解決,只是一種思路推薦哈,有好的方法歡迎留言共同探討;如有錯誤歡迎大佬指出,非常感謝;
總結
以上是生活随笔為你收集整理的python list remove 删除引用_Python——list列表操作一坑(remove)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web高德地图怎么加载离线地图_怎么验证
- 下一篇: 你的电脑被挖矿了吗你的电脑被挖矿了吗英语