Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中从列表继承时的奇怪行为_Python_Class_Inheritance - Fatal编程技术网

在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<代码>自我指的是与以前相同的对象。只有在不可能的情况下,它才会返回一个新的,然后进行分配