【问题标题】:List inheritance: "extend" vs "+" vs "+=" [duplicate]列表继承:“扩展”与“+”与“+=”[重复]
【发布时间】:2020-03-16 00:45:26
【问题描述】:

我想了解为什么以下三个极其简单的 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: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]

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

提前谢谢你。

【问题讨论】:

    标签: python list inheritance


    【解决方案1】:
        self = self + item
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2010-11-11
      • 2011-05-06
      • 2014-02-15
      • 2012-06-17
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多