Code前端首页关于Code前端联系我们

Python开发:a += b 不一定等价于 a = a + b

terry 2年前 (2023-09-25) 阅读数 49 #后端开发

我在一些博客中看到过这样的说法:

a += 1
复制代码

等价于

a = a + 1
复制代码

这种说法其实并不正确。

我们看个例子:

>>> a = [1, 2, 3]
>>> a += (4,)
>>> a
[1, 2, 3, 4]

>>> a = [1, 2, 3]
>>> a = a + (4,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
复制代码

这里报错,说明a += ba = a + b不完全等价。

其实这是因为+=首先调用了左边对象的__iadd__方法。如果没有 __iadd__ 方法,则调用 。 __add__ 方法。但如果直接使用数字+,则直接调用方法__add__。对于字符串、数字和浮点数等不可变对象,它们没有 __iadd__ 方法,因此对于它们来说,a += ba = a + b 是等价的。

但是列表是一个可变容器,并且其中有方法__iadd__。对于列表,其 __iadd__ 方法的原型如下:

    def __iadd__(self, values):
        self.extend(values)
        return self
复制代码

你可以在这里看到这段代码:github.com/python/cpyt…

所以,如果你使用 If + = 将列表连接到元组中,本质上是使用列表 extend 来追加元组的内容。这样就不会报错了:

>>> a = [1, 2, 3]
>>> a.extend((4,))
>>> a
[1, 2, 3, 4]

作者:庆南
链接:https://juejin.im/post/5c504bace51d450d064623f0
来源:掘金属于版权。如需商业转载,请联系作者授权。非商业转载请来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门