当Python列表遇上复合赋值运算符+=

首先感谢集美大学蔡莉白老师发现这个问题并与我沟通交流,我在蔡老师提供的代码基础上又稍作扩展和补充。

对于列表x而言,x += y和x = x+y并不等价,在一定程度上,+=类似于append(),但是又不完全一样。

正常来讲,作用于列表时,运算符+=的用法是这样的:

>>> x = []

>>> x += [1, 2, 3]

>>> x

[1, 2, 3]

列表与列表相加,从效果上来看,似乎与x = x + [1, 2, 3]是一样的,然而,内部的区别的还是很大的。例如:

>>> x = []

>>> id(x)

48248392

>>> x += [3]

>>> id(x)

48248392

>>> x = x + [4]

>>> x

[3, 4]

>>> id(x)

49375176

这段代码说明的是,+=属于原地操作,不会修改列表首地址,类似于列表append()方法,而... = ...+...这样的写法是创新一个新对象,会修改列表首地址。

既然+=类似于append()方法,那是不是用法也一样呢?看下面的代码:

>>> x = []

>>> x.append(3)

>>> x

[3]

>>> x += 5

Traceback (most recent call last):

File "<pyshell#18>", line 1, in <module>

x += 5

TypeError: 'int' object is not iterable

结果证明,+=和append()的用法还是有区别的。但是,我们无意中注意到上面的异常信息说整数是不可以迭代的,这句话似乎有深意啊。如果我们在+=的左侧是列表,而右边是可迭代对象,会是什么结果呢?

>>> x = [] >>> x += 'ab' >>> x ['a', 'b'] >>> x += (1,2) >>> x ['a', 'b', 1, 2] >>> x += {1,2} >>> x ['a', 'b', 1, 2, 1, 2] >>> x += {1:'a', 2:'b'} >>> x ['a', 'b', 1, 2, 1, 2, 1, 2] >>> x += range(3) >>> x ['a', 'b', 1, 2, 1, 2, 1, 2, 0, 1, 2] >>> x += map(str, range(3)) >>> x ['a', 'b', 1, 2, 1, 2, 1, 2, 0, 1, 2, '0', '1', '2']

使用+=运算符居然能把列表和元组、集合、字典甚至map对象、range对象里的元素连接到一起。

那么运算符+是不是也支持类似的用法呢?遗憾的是,不支持,有代码为证: >>> x = x + '1234' Traceback (most recent call last): File "<pyshell#27>", line 1, in <module> x = x + '1234' TypeError: can only concatenate list (not "str") to list >>> x = x + {1, 2, 3} Traceback (most recent call last): File "<pyshell#28>", line 1, in <module> x = x + {1, 2, 3} TypeError: can only concatenate list (not "set") to list >>> x = x + {1:'a', 2:'b'} Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> x = x + {1:'a', 2:'b'} TypeError: can only concatenate list (not "dict") to list

简单总结一下,对于列表而言,+=右侧的对象可以是任何Python可迭代对象,并且+=的过程类似于循环+append(),如下面的代码:

>>> x = [] >>> x += '1234' >>> x ['1', '2', '3', '4'] >>> x = [] >>> for item in '1234': x.append(item)

>>> x ['1', '2', '3', '4']

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP实战技术

解构赋值,你不能不懂!

153100
来自专栏老九学堂

Java微课堂之数据类型转换

1 数据类型知识点微课笔记 碎片化的学习,注重积累,快乐学习。 Java的数据不同的数据类型的变量在编程过程中很多情况会遇到一些运算。我们知道,相同的数据类型进...

24030
来自专栏云霄雨霁

排序----堆排序

17400
来自专栏技术专栏

python3入门与实践(六):函数式编程

一定程度下lambda可以替换命令式编程的函数,reduce可以替换命令式编程的循环

11610
来自专栏北京马哥教育

从Zero到Hero,一文掌握Python关键代码

本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要且常见的语法,如基本的条件、循环语句,基本的列表和字典等数据结构,此外还介绍...

32570
来自专栏布尔

想起温习一下JS中的this apply call arguments

很多时候讲到语言入门,大家会认为就是要了解一下语言的语法、数据类型和常用函数。这一课对于所有的计算机专业的毕业生来说都可以自学,然而在最近的实践中(带了两个实习...

227100
来自专栏程序员同行者

python基础(一)

所以,以下这些值都是对象: "guigu"、38、['北京', '上海', '深圳'],并且是根据不同的类生成的对象。

11020
来自专栏JetpropelledSnake

Python入门之面向对象编程(一)面向对象概念及优点

本文分为如下几个部分 首先说明面向对象是什么,然后结合实际例子说明面向对象的如下几个优点 方便函数管理 数据封装 对象操作 最后总结一下面向对象的好处 概念...

39070
来自专栏PPV课数据科学社区

【工具】Python正则表达式的七个使用范例

? 作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。 本文是一系列关于Py...

35890
来自专栏liulun

Nim教程【十】

openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一...

29580

扫码关注云+社区

领取腾讯云代金券