关于python:将字符串添加到列表中

Adding a string to a list

1
2
3
4
5
6
>>> b = []
>>> c = '1234'
>>> b += c
>>> b
['1', '2', '3', '4']
>>>

这里发生了什么?这不应该奏效,对吧?或者我错过了一些明显的东西?

1
2
3
4
5
6
7
8
>>> 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


字符串是不可重复的:元素是字符串的字符。将iterable添加到列表中时,iterable的元素将附加到列表中。

以下任一项将按您的期望执行(即追加字符串,而不是用字符串的字符扩展列表):

1
b += [c]

1
b.append(c)


+=运算符扩展列表而不是附加到列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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']


这不是对最初的问题的回答(我认为已经得到了充分的回答),而是对关于增广赋值(+=和类似操作)语义的评论中提出的众多问题的回答。

简而言之:对于可变类型,增强赋值的效果与不可变类型不同。

strtuple和数字类型等都是不可变的。一旦创建了元组,就无法更改其内容,因此您将获得以下行为:

1
2
3
4
5
6
7
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)

str具有相同的语义。基本上,如果a不变,那么a += b相当于a = a + b

大多数其他类型,包括list,都是可变的。列表的内容可以在适当的位置进行更改,而增强的赋值正好做到了这一点。因此:

1
2
3
4
5
6
7
>>> 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]

对于用户定义的类,语义取决于它是如何实现的,但这是根据PEP203应该如何实现的。


+=是扩展的语法甜头,但+只是列表连接。如果扩展,您将遍历参数,在本例中,该参数是一个字符串。但不能将字符串连接到列表,因此+失败。


字符串是一系列字符。列表操作+=接受任何序列并将序列的每个元素附加到列表中。

(实际上,+=取任何一个不可数。)


实际上,列表上的+=运算符将检索C的迭代器,它将按顺序生成各个字符。如果您打算将实际字符串添加到列表中,并生成结果['1234'],则可以改用b.append('1234')。


你期待什么?如果要添加C作为字符串,必须执行以下操作:

1
b.append(c)

干杯!