我想了解为什么以下三个非常简单的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]
我有点困惑...发生了什么事?
谢谢。
答案 0 :(得分:5)
self = self + item
不修改对象,仅修改方法内部的局部变量。
解释器使用+
在__add__
中调用list
,这将创建一个新列表,然后使self
变量指向add
方法,并在方法退出时将其值丢弃。
另一方面,+=
版本调用__iadd__
类的list
方法,该方法将按预期更新其内容。