python列表刪除元素及remove的奇怪現象


先看一個例子:

test1 = ['a','b','c','','']
for
i in test1: if i == '': test1.remove(i) #刪除空元素 print(test1)

>>>['a', 'b', 'c', '']

這時發現並沒有達到我們想要的結果,原因分析如下:

要了解一下python列表的數據結構,列表屬於連續線性表,它的連續在於有一塊連續的內存儲存着列表中元素的地址,如圖(忽略地址與值所占的字節,只為方便舉例子):

 

當然也可以通過一個代碼來看證明一下:

a=[1,2,3]
for i in a:
    print(id(i))
>>>1514106336 #此地址即為左邊的連續地址

1514106368
   1514106400

 

回到問題,當我們刪除test1中的空字符時,test1 = ['a','b','c','',''],for in 是對下標進行操作,而remove是對值進行操作,當for到達索引為3,即第一個空字符位置時,
符合條件即刪除,后面的那個空字符的索引成為了3,此時對於for循環已經完成任務,故剩余一個空字符。
還有一個簡單的小例子:
a=[1,2,3]
for i in a:
    print(i,id(i))
print("------------------")
for i in a:
    if i==1:
        a.remove(i)
    print(i,id(i))
print("------------------")
print(a)
>>>
1 1380150752
2 1380150784
3 1380150816
------------------
1 1380150752
3 1380150816
------------------
[2, 3]
 
        

在列表中遍歷,當元素值為1時刪除此元素,然后打印,我們得到的輸出結果是打印1和3,這和上面那個道理是一樣的,刪除1后,2會取代1的位置,3取代2的位置,所以就第二次遍歷就輸出3了,

python中一切皆對象,i是一個臨時變量,刪除了元素1后還可以輸出i的值及地址,數組元素的移除和i沒有關系。

 
列表有三種刪除元素方式,del,remove,pop,其中del是python的一個方法不是列表所特有,pop()參數為元素的索引,remove()參數是想要刪除的值

用一下del看看會出現什么結果:
a=[1,2,3]
for i in a:
    if i==2:
        del i
        print(id(i))
#報錯 NameError: name 'i' is not defined

 

a=[1,2,3]
for i in a:
    if i==2:
        del i #del是解除引用,python中一切皆引用
    try:
         print(id(i))
    except NameError:
        pass
a刪除前地址1927704032   
      1927704064           
       1927704096
刪除后輸出 1927704032
  
1927704096
 
        

對比地址的變化,可以得知del刪除了該元素內存地址引用,所以報了錯,與remove對比。

刪除列表中的空元素有這兩種方法:

#第一種
test2 = ['a','','b','','c','','']
while '' in test2:
    test2.remove('')
print(test2)
>>>['a', 'b', 'c']
#第二種
test2_new = [i for i in test2 if i != ''] #生成一個新的列表

即刪除列表中指定元素建議使用上述兩種方法,不要用for循環。

上面記錄是寫代碼時踩的坑,有不嚴謹或者錯誤的地方期望大家指正。

個人公眾號,關注即可獲得作者精選的python學習資料,pycharm注冊碼。

 


免責聲明!

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



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