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

栏目: Python · 发布时间: 5年前

内容简介:大家经常在一些博客中看到这样的说法:等价于这种说法实际上并不准确。

大家经常在一些博客中看到这样的说法:

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]
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design Accessible Web Sites

Design Accessible Web Sites

Jeremy Sydik / Pragmatic Bookshelf / 2007-11-05 / USD 34.95

It's not a one-browser web anymore. You need to reach audiences that use cell phones, PDAs, game consoles, or other "alternative" browsers, as well as users with disabilities. Legal requirements for a......一起来看看 《Design Accessible Web Sites》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具