您当前的位置:首页 > 计算机 > 编程开发 > Python

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

时间:12-27来源:作者:点击数:

对于列表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']

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门