gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:23:33 25 4
gpt4 key购买 nike

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

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__()但是,应该首先尝试修改它所操作的对象。在这种情况下,它返回它,以便对象不会发生更改,即。 e. self指的是与之前相同的对象。仅当这不可能时,它才会返回一个新的,然后进行分配。

关于python - 从 python 中的列表继承时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com