Python开发:a += b 不一定等价于 a = a + b
我在一些博客中看到过这样的说法:
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 += b和a = a + b不完全等价。
其实这是因为+=首先调用了左边对象的__iadd__方法。如果没有 __iadd__ 方法,则调用 。 __add__ 方法。但如果直接使用数字+,则直接调用方法__add__。对于字符串、数字和浮点数等不可变对象,它们没有 __iadd__ 方法,因此对于它们来说,a += b 和 a = 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前端网发表,如需转载,请注明页面地址。
code前端网
