Python继承list类实现rm_all方法调用时自动更新自身的问题咨询
解决方案
首先你的现有代码问题在于:rm_all方法仅生成并返回了过滤后的新列表,没有修改当前NewList实例自身存储的元素,因此原列表不会发生变化。你不需要重赋值self,直接操作可变的列表实例本身即可实现原地修改。
推荐修改方案
直接通过切片赋值替换当前实例的所有元素,代码最简单高效:
class NewList(list): # 原__init__里的self.__list__ = self属于冗余代码,没有实际作用可以直接删除 def rm_all(self, qw): # 切片赋值直接修改自身所有元素 self[:] = [x for x in self if x != qw] # 如果要对齐Python原生list方法(比如remove)的行为,不要加返回值;如果需要支持链式调用可以加return self
测试效果
执行以下代码即可看到原列表被原地修改:
l = NewList([1,2,1,3,2,1,2,1,3,1,1,2]) l.rm_all(1) print(l) # 输出:[2, 3, 2, 2, 3, 2]
可选低内存实现方案
如果要处理超大列表,不想生成临时的过滤列表,可以反向遍历索引删除匹配元素,避免正向遍历时删除元素导致的索引偏移问题:
def rm_all(self, qw): for i in reversed(range(len(self))): if self[i] == qw: del self[i]
内容的提问来源于stack exchange,提问作者user3329732
相关产品推荐
相关产品推荐

