从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有效,但第一个方法无效?

g

因为这就是就地操作员的工作方式。

self = self + [thing]创建一个新列表并将其放入局部变量中self,以覆盖传递的列表。但是它不会修改对象本身。在内部,它可以self = self.__add__([thing])

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python列表的奇怪行为

来自分类Dev

Python列表的奇怪行为

来自分类Dev

Python列表奇怪的行为

来自分类Dev

更改列表中列表的值时的奇怪行为

来自分类Dev

将项目附加到python中的字典中的列表时的奇怪行为

来自分类Dev

添加python列表时出现奇怪的pymongo行为

来自分类Dev

R中列表的奇怪行为

来自分类Dev

Python在列表奇怪的行为中获得元素的排名

来自分类Dev

QGraphicsTextItem继承。奇怪的行为

来自分类Dev

在python中替换字符串时出现奇怪的行为

来自分类Dev

在Python中为True定义值时的奇怪行为

来自分类Dev

在cython cdef类中创建python属性时的奇怪行为

来自分类Dev

在python中替换字符串时出现奇怪的行为

来自分类Dev

python中的奇怪线程行为

来自分类Dev

python中str的奇怪行为

来自分类Dev

Python中循环的奇怪行为

来自分类Dev

涉及Python嵌套列表的奇怪行为

来自分类Dev

python 2奇怪的列表理解行为

来自分类Dev

数组列表中Contains()的奇怪行为

来自分类Dev

从列表中随机选择功能并测试其功能时的奇怪行为

来自分类Dev

返回选项时mapValues中的奇怪行为

来自分类Dev

检查Alloy中的断言时的奇怪行为

来自分类Dev

在LowerCamelCase中命名变量时的奇怪行为

来自分类Dev

从R中的stdin读取时的奇怪行为

来自分类Dev

在viewDidLoad中调用addSubView时的奇怪行为

来自分类Dev

在 Pendrive 中传输文件时的奇怪行为

来自分类Dev

在Python3中删除列表中的项作为for循环-奇怪的行为

来自分类Dev

将字典追加到列表时的奇怪行为

来自分类Dev

python子进程中的线程行为很奇怪