将字符串添加到列表中

时间:2011-11-30 08:02:35

标签: python string list

>>> 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 个答案:

答案 0 :(得分:14)

字符串是可迭代的:元素是字符串的字符。将iterable添加到列表时,可迭代的元素会附加到列表中。

以下任何一种都会做你期望的事情(即附加字符串,而不是用字符串的字符扩展列表):

b += [c]

b.append(c)

答案 1 :(得分: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']

答案 2 :(得分:3)

这是一个答案,不是原始问题(我认为已经得到充分回答),而是答案中关于增强赋值(+=和类似操作)语义的评论中提出的众多问题

简而言之:增强赋值对于可变类型的工作方式与对不可变类型的工作方式不同。

strtuple和数字类型等是不可变的。元组的内容一旦创建就无法更改,因此您会遇到以下行为:

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

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

大多数其他类型,包括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的方式完成的。

答案 3 :(得分:2)

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

(实际上+=接受任何迭代。)

答案 4 :(得分:2)

+ =是扩展的语法糖,但+只是列表连接。如果你扩展,你将遍历参数,在这种情况下是一个字符串。但是你不能将字符串连接到列表,因此+失败。

答案 5 :(得分:0)

你期待什么?如果您想将 c 添加为字符串,则必须执行以下操作:

b.append(c)

干杯!

答案 6 :(得分:0)

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