使用增强赋值将字符串添加到列表中
>>> b = []
>>> c = '1234'
>>> b += c
>>> b
['1', '2', '3', '4']
>>>
这里发生了什么?这应该不行吧?还是我漏掉了什么明显的东西?
>>> b = []
>>> c = '1234'
>>> b + c
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
b + c
TypeError: can only concatenate list (not "str") to list
>>>
那么 a += b
并不总是等同于 a = a + b
吗?
7 个回答
4
这段话不是在回答最初的问题(我觉得那个问题已经得到很好的解答),而是针对评论中关于增强赋值(+=
和类似操作)语义的众多提问。
简单来说:增强赋值在可变类型和不可变类型之间的表现是不同的。
str
(字符串)、tuple
(元组)和数字类型等都是不可变的。元组一旦创建,其内容就不能再改变,所以你会看到这样的行为:
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)
str
也是一样的道理。基本上,如果 a
是不可变的,那么 a += b
和 a = a + b
是等价的。
大多数其他类型,包括 list
(列表),都是可变的。列表的内容是可以直接修改的,而增强赋值正是这样做的。因此:
>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
如果第三行被替换成 a = a + [3, 4]
,那么会创建一个新的列表,而 b
将会是 [1, 2]
。
对于用户自定义的类,其语义取决于它是如何实现的,但根据 PEP 203 的规定,应该是这样处理的。
10
这个 +=
操作符是用来“扩展”一个列表,而不是简单地把东西加到列表的末尾:
>>> b = []
>>> c = "1234"
>>> b.append(c)
>>> b
['1234']
>>> b.extend(c)
>>> b
['1234', '1', '2', '3', '4']
>>> b += c
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4']
>>> b += [c]
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4', '1234']
18
字符串是可以被遍历的,也就是说,字符串里的每一个字符都是一个元素。当你把一个可遍历的东西(比如字符串)加到一个列表里时,这个可遍历的东西里的元素会被添加到这个列表中。
下面这两种写法都能达到你想要的效果(也就是把整个字符串添加到列表里,而不是把字符串里的每个字符单独添加到列表中):
b += [c]
或者
b.append(c)