python - 列表继承:"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]
我有点困惑……发生了什么事?
先感谢您。
解决方案
self = self + item
不修改对象,只修改方法内部的局部变量。
通过使用+
解释器调用__add__
in list
,它创建了一个新列表,然后您在方法中使self
变量指向它add
,并且当方法退出时,它的值被丢弃。
另一方面,+=
版本调用类的__iadd__
方法list
,它按预期更新其内容。
推荐阅读
- android - Telephony.TextBasedSmsColumns 中的 Android 交付信息
- java - 使用 PDFBox 时 Mac Preview 和 Adobe Acrobat 上的不同 PDCheckBox 外观
- sql - 当关联的查询元素不返回值时,设置表单字段的默认值
- javascript - 让 antd 的 Sider 响应式
- xml - Spark Scala - 将数据框中的 XML 列转换为多列
- angular - 使用 templateUrl (Angular 7) 中的条件在移动或桌面模板之间切换
- java - 通过 EC2 标签解析特定值
- php - SSL 上的 fsockopen 在特定主机上不起作用
- r - R中逐渐重叠线图的方法
- qt - 菜单栏未显示在第二个窗口上