慎用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元素的问题,我推荐用下面的方法。
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‘]
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。