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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。