繁体   English   中英

从python中的列表继承时的奇怪行为

[英]Strange behaviour when inheriting from a list in python

我最近在摆弄继承,对以下行为感到有些困惑:

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.__add__([thing])

self += [thing] (OTOH)可就地修改列表。 在内部,它首先尝试self = self.__iadd__([thing]) iadd代表“就地添加”。 仅当不存在时,才会调用self = self.__add__([thing])

不同之处在于__add__()始终创建一个新对象,而其他对象保持不变。 但是, __iadd__()应该首先尝试对其进行操作的对象进行修改 在这种情况下,它返回它,这样就不会发生对象更改 ,即self指向与以前相同的对象。 仅当这不可能时,它会返回一个新的,然后分配。

list.__add__() (内置+运算符)创建一个新列表,而list.__iadd__() (内置+=运算符)修改该列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM