慎用python的pop和remove方法

2022-05-04 05:00:15 字數 1600 閱讀 6987

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 = x_new

print x

----------------------

result:

['a', 'd']

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

python中的pop 函式

語法 列表list.pop obj list 1 pop 用於刪除並返回列表中的乙個元素 預設為最後乙個元素 字典dict.pop key default pop 用於刪除字典中給定的key及對應的value,返回被刪除key對應的value,key值必須給出。給定的key值不在字典中時,返回def...

Python 字典的pop 方法

pop 移除序列中的乙個元素 預設最後乙個元素 並且返回該元素的值。一 移除list的元素,若元素序號超出list,報錯 pop index out of range 超出範圍的流行指數 a 預設移除最後乙個元素 list 1 1,2,3,4,5 a list 1.pop print list 1,...

python中列表和字典中的pop區別

在字典 語法 dict.pop key,value 說明 刪除指定鍵及對應的值,如果在字典中不存在鍵及value,則返回pop 中指定的key對應的value,即設定了預設值 示例 data data.pop c 3 3 data.pop a 1 data 在列表中 語法 list.pop inde...