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,這裏涉及到引用和深淺複製的問題,因此不在此處解答

  

同時, 如果 for i in x:改成for i in x[:]:也可以實現,這是因爲x[:]與x不是同一個list,相當與把x的內存拷貝到一塊新的內存,當對x做remove操作的時候,新的內存list並沒有受影響。

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