python - 列表继承 : "extend" vs "+" vs "+="

标签 python list inheritance

这个问题在这里已经有了答案:





Why does += behave unexpectedly on lists?

(9 个回答)



Different behaviour for list.__iadd__ and list.__add__

(3 个回答)


1年前关闭。




我想了解为什么以下三个非常简单的 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]
我有点困惑……发生了什么事?

先感谢您。

最佳答案

    self = self + item

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

通过使用 +口译员正在调用 __add__list ,这将创建一个新列表,然后您将创建 self变量指向它内 add方法,当方法退出时,它的值被丢弃。

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

关于python - 列表继承 : "extend" vs "+" vs "+=",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58951984/

相关文章:

ruby-on-rails - 为什么 DataMapper 使用混合与继承?

python - 在第二个列表中查找一个列表的第一个实例

python - 在 python : parameters for scipy. interpolate.splrep 中拟合周期图,曲线方程?

python - 是否可以在 Tkinter 下拉菜单中获取用户文本输入?如果是这样,怎么办?

c# - 如何从 List<T> 中删除特定对象

c++ - 返回派生类型实例的 CRTP 和函数

C++ 析构函数继承

python - 如何从 csv 文件中排除特定组?

r - 将数据框列表的名称的数字部分添加为列

python - 计算列表中第二个元素的频率? (Python)