python中remove的一些坑


  前幾天,使用python時遇到這么一個需求,刪除一個列表中值為1的元素。我尋思着使用remove方法,但是remove方法只會刪除第一個,於是我使用for循環去刪除。代碼和運行結果如下:

  當時這個結果讓我很懵逼,為什么1沒有被刪除完?查了資料發現,是for循環搗的鬼。因為for循環實際是循環的列表下標(索引),同時由於列表的可變性,每一次刪除一個元素,列表的長度就會發生變化,元素的索引也會發生變化。這里來具體分析一下這段代碼:

  第一次循環,循環索引為0,此時索引為0的元素是1,滿足條件,因此mylist中的第一個1被刪除,此時mylist變為[1,2,1,1,3,4];

  第二次循環,循環索引為1,此時新列表中,索引為1的元素是2,不滿足條件,mylist仍然為[1,2,1,1,3,4];

  第三次循環,循環索引為2,此時列表中,索引為2的元素是1,滿足條件,remove方法會再次刪除一個1,但是remove會刪除第一次出現的1(即刪除索引為0的那個1),因此列表變為[2,1,1,3,4];

  第四次循環,循環索引為3,新列表中,索引為3的元素是3,不滿足條件,mylist仍然為[2,1,1,3,4];

  第五次循環,循環索引為4,此時列表中,索引為4的元素是4,不滿足條件,mylist仍然為[2,1,1,3,4];

  此時,由於新列表長度為5,於是循環結束。

   下面的截圖結果能夠很直觀的看出來。

  至此,如果是這樣的一段代碼,結果應該是怎樣?

  最終mylist=['b','d'],怎么樣,和你計算的值是否一樣?

  回到最初的需求,要怎樣才能刪除所有的1,這里可以使用deepcopy來復制一份,之后一個列表用於循環,一個用於移除值。代碼和結果如下:

  這樣就可以實現刪除列表中的所有值為1的元素。這里可能有人會問,為什么不直接將l1賦值給一個變量,即l2=l1,這里涉及到引用和深淺復制的問題,因此不在此處解答

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM