使用增强赋值将字符串添加到列表中

13 投票
7 回答
8561 浏览
提问于 2025-04-17 07:22
>>> 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 += ba = 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)

撰写回答