在Python中创建列表子类时就地追加



我想在Python中子类化list对象,并添加一个类似于append方法的方法。在下面的示例中,我将其命名为append_

class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self

这是一个相当简单的例子,但这里是我的问题:假设我实例化一个对象my_list与一些列表,然后我尝试追加一个额外的元素到my_list

my_list = MyList(list(range(5)))
my_list.append_(6) # returns [0,1,2,3,4,6]
# BUT 
my_list # returns [0,1,2,3,4]

所以在末尾我什么也没附加。我既不明白哪里出了问题,也不知道在哪里可以找到解决这个问题的帮助。

我正在使用Python 3.9.12,如果它有帮助…

代码似乎没有问题,因为我能够正常运行

与repl

一起使用也许试着把代码放到一个新文件

"_"是问题吗

哦,我终于又试了一件事:

class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self.__init__(new_list)
return self

最终按预期工作。我不确定我明白为什么,虽然,所以如果有人想详细说明这个工作解决方案,我会很高兴:-)

由于append_()函数在其名称末尾包含下划线,因此在调用它时不会向列表对象添加任何内容。因此,为了得到正确的结果,您需要使用不带下划线的append():

class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append(6))
print(my_list)

输出:

[0, 1, 2, 3, 4]
None
[0, 1, 2, 3, 4, 6]

相反,当您在类中运行函数代码时:

class MyList(list):
def append_(self, element):
new_list = list(self)
new_list.append(element)
self = self.__class__(new_list)
return self
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append_(6))
print(my_list)

打印错误的输出,不修改列表:

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]

另外,您可以更改append_()函数以获得所需的功能:

class MyList(list):
def append_(self, element):
self.append(element)
my_list = MyList(list(range(5)))
print(my_list)
print(my_list.append_(6))
print(my_list)

输出:

[0, 1, 2, 3, 4]
None
[0, 1, 2, 3, 4, 6]

最新更新