前幾天,使用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,這里涉及到引用和深淺復制的問題,因此不在此處解答