>>> 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
?
答案 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)
这是一个答案,不是原始问题(我认为已经得到充分回答),而是答案中关于增强赋值(+=
和类似操作)语义的评论中提出的众多问题
简而言之:增强赋值对于可变类型的工作方式与对不可变类型的工作方式不同。
str
,tuple
和数字类型等是不可变的。元组的内容一旦创建就无法更改,因此您会遇到以下行为:
>>> 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')。