首先感谢集美大学蔡莉白老师发现这个问题并与我沟通交流,我在蔡老师提供的代码基础上又稍作扩展和补充。
对于列表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']
----------相关阅读---------
----------喜大普奔----------
1、继《Python程序设计基础》(2017年9月第5次印刷)、《Python程序设计(第2版)》(2017年9月第4次印刷)、《Python可以这样学》(2017年7月第3次印刷)系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版,并于2017年9月进行了第2次印刷。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:
https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3