慎用python的pop和remove方法


申明:轉載請注明出處!!!

 

Python關於刪除list中的某個元素,一般有兩種方法,pop()和remove()。

如果刪除單個元素,使用基本沒有什么問題,具體如下。

1.pop()方法,傳遞的是待刪除元素的index:

x = ['a', 'b', 'c', 'd']
x.pop(2)
print x

------------------
result:
['a', 'b', 'd']

  

2. remove()傳遞待刪除元素,如果多個元素一樣,默認刪除第一個:

x = ['a', 'b', 'a', 'c', 'd']
x.remove('a')
print x

-----------------
result:
['b', 'a', 'c', 'd']

  

如果要循環刪除符合某個條件的元素,慎用!!

x = ['a', 'b', 'c', 'd']
y = ['b', 'c']
for i in x:
	if i in y:
		x.remove(i)
print x

-----------------------
result:
['a', 'c', 'd']

  

x = ['a', 'b', 'c', 'd']
y = ['b', 'c']
for i in x:
	if i in y:
		idx = x.index(i)
		x.pop(idx)
print x

--------------
result:
['a', 'c', 'd']

  我認為出現這種情況的主要原因是,pop和remove方法屬於‘破壞性操作‘(ps:原諒我自創的定義),x.remove()后,內存中原來存放x的位置已經釋放,又重新申請了內存存放新的x。可以理解為x已經不是原來的x了,而for循環中傳遞的x還是原來x在內存中的位置,所以在x.remove(i)后,for循環找不到x了,后面的刪除即無法完成。為了完成循環刪除list元素的問題,我推薦用下面的方法。

  感謝也許小念舊 的提醒,原先的解釋是錯誤的,造成上述現象的原因是因為,Python中for i in list是用迭代器實現,內部隱藏了記錄當前迭代器的狀態,而remove方法刪除了當前元素后,迭代器自動指到下一個元素,原先的list在內存中的位置並未改變。用下面方法可以避免。

x = ['a', 'b', 'c', 'd']
y = ['b', 'c']
x_new = []
for i in x:
	if i not in y:
		x_new.append(i)
x = x_new
print x

----------------------
result:
['a', 'd']

  

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


免責聲明!

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



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