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

简介: 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

这一段代码你可以在这里看到:https://github.com/python/cpython/blob/1b5f9c9653f348b0aa8b7ca39f8a9361150f7dfc/Lib/collectionsabc.py

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

>>> a = [1, 2, 3]
>>> a.extend((4,))
>>> a
[1, 2, 3, 4]
目录
相关文章
|
存储 Python
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
116 0
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
|
存储 Python
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
168 0
Python 教程之运算符(12)a += b 并不总是等价于 a = a + b
|
11天前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
184 102
|
11天前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
181 104
|
11天前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
177 103
|
11天前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
124 82
|
11天前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
29 0
|
20天前
|
存储 人工智能 算法
Python实现简易成语接龙小游戏:从零开始的趣味编程实践
本项目将中国传统文化与编程思维相结合,通过Python实现成语接龙游戏,涵盖数据结构、算法设计与简单AI逻辑,帮助学习者在趣味实践中掌握编程技能。
81 0
|
1月前
|
安全 测试技术 数据处理
Python列表推导式进阶:从简洁代码到高效编程的10个核心技巧
列表推导式是Python中高效的数据处理工具,能将多行循环代码压缩为一行,提升代码可读性与执行效率。本文详解其基础语法、嵌套循环、条件表达式、函数融合、性能优化等进阶技巧,并结合实战案例与边界条件处理,帮助开发者写出更优雅、高效的Python代码。
114 0
|
1月前
|
机器学习/深度学习 人工智能 运维
Python:简洁高效的万能编程胶水
Python:简洁高效的万能编程胶水

推荐镜像

更多