首页 > 解决方案 > 列表继承:"extend" vs "+" vs "+="

问题描述

我想了解为什么以下三个极其简单的 python 代码给出(显然)不一致的答案。这只是一个了解正在发生的事情的玩具练习,而不是现实世界的问题。myList(list) 类继承自 list 并定义了一个方法“add”,该方法应该模仿众所周知的“extend”方法。我尝试了三种方式来做到这一点,直接使用extend,使用+ 运算符和使用+=。然而,令人惊讶的是,我得到了不一致的答案。请注意,在这三个代码中,有一行(在 add 方法内)发生了变化。

代码 1:self.extend(item)

class myList(list): 

    def add(self,item):
        self.extend(item)

l = myList([1,2])
l.add([3,4])
print(l)

印刷[1, 2, 3, 4]

代码 2:自我 = 自我 + 项目

class myList(list):

    def add(self,item):
        self = self + item

l = myList([1,2])
l.add([3,4])
print(l)

印刷[1, 2]

代码 3:自我 += 项目

class myList(list):

    def add(self,item):
        self += item

l = myList([1,2])
l.add([3,4])
print(l)

印刷[1, 2, 3, 4]

我有点困惑……发生了什么事?

先感谢您。

标签: pythonlistinheritance

解决方案


    self = self + item

不修改对象,只修改方法内部的局部变量。

通过使用+解释器调用__add__in list,它创建了一个新列表,然后您在方法中使self变量指向它add,并且当方法退出时,它的值被丢弃。

另一方面,+=版本调用类的__iadd__方法list,它按预期更新其内容。


推荐阅读