列表继承:使用"extend"、"+"和"+="的区别

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

CODE 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:self = self + item

class myList(list):

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

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

打印 [1, 2]

代码 3:self += item

class myList(list):

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

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

打印 [1, 2, 3, 4]

我有点困惑...这是在发生什么?

提前感谢您。

1个回答

5
    self = self + item

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

使用+时,解释器会调用list中的__add__方法创建一个新列表,然后你将self变量指向了它,在add方法退出时,该值被丢弃。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接