在python中从列表继承时的奇怪行为
我最近在处理继承问题,我对以下行为感到有点困惑:在python中从列表继承时的奇怪行为,python,class,inheritance,Python,Class,Inheritance,我最近在处理继承问题,我对以下行为感到有点困惑: class Foo(list): def method(self, thing): new = self + [thing] print(new) self = new print(self) def method2(self, thing): self += [thing] >>> f = Foo([1, 2, 3, 4, 5
class Foo(list):
def method(self, thing):
new = self + [thing]
print(new)
self = new
print(self)
def method2(self, thing):
self += [thing]
>>> f = Foo([1, 2, 3, 4, 5])
>>> f.method(10)
[1, 2, 3, 4, 5, 10]
[1, 2, 3, 4, 5, 10]
>>> f
[1, 2, 3, 4, 5]
>>> f.method2(10)
>>> f
[1, 2, 3, 4, 5, 10]
为什么就地方法
method2
工作,而第一个不工作?列表。添加(
)
(+
操作符内置)创建一个新列表,而列表。
(+=
操作符内置)修改就地列表。因为就地操作符就是这样工作的
self=self+[thing]
创建一个新列表,并将其放入局部变量self
,覆盖传递的列表。但它不会修改对象本身。在内部,它确实是self=self.\uuuuu添加([thing])
self+=[thing]
,OTOH,在适当的位置修改列表。在内部,它首先尝试self=self.\uuuidd([thing])
<代码>iadd表示“就地添加”。只有当它不存在时,才会调用self=self.\uu添加([thing])
区别在于\uuuu add\uuuu()
总是创建一个新对象,而其他对象则保持不变<但是,代码>\uuu iadd\uuu()应该首先尝试修改它所操作的对象。在本例中,它返回它,这样就不会发生对象的更改,即。e<代码>自我指的是与以前相同的对象。只有在不可能的情况下,它才会返回一个新的,然后进行分配