日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python list remove 删除引用_Python——list列表操作一坑(remove)

發布時間:2023/12/4 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。