社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python中a += b 并不一定等价于a = a + b

青南 • 5 年前 • 497 次点击  
阅读 23

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 += 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…

所以说,当你使用+=连接列表和元组的时候,本质上是列表使用extend把元组的内容添加进去。这样是不会报错的:

>>> a = [1, 2, 3]
>>> a.extend((4,))
>>> a
[1, 2, 3, 4]
复制代码

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/0DnlXhUuKX
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28437
 
497 次点击