列表继承:“ extend” vs“ +” vs“ + =”

时间:2019-11-20 10:22:05

标签: python list inheritance

我想了解为什么以下三个非常简单的python代码给出(显然)不一致的答案。这只是一种玩具练习,它可以了解正在发生的事情,而不是一个现实问题。类myList(list)从list继承,并定义了一种方法“ add”,该方法应模仿众所周知的“ 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]

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

谢谢。

1 个答案:

答案 0 :(得分:5)

    self = self + item

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

解释器使用+__add__中调用list,这将创建一个新列表,然后使self变量指向add方法,并在方法退出时将其值丢弃。

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