先看一個例子:
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時刪除此元素,然后打印,我們得到的輸出結果是打印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注冊碼。