10
>>> 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?

4

7 回答 7

15

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

以下任何一项都可以满足您的期望(即附加字符串,而不是使用字符串的字符扩展列表):

b += [c]

或者

b.append(c)
于 2011-11-30T08:04:40.437 回答
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']
于 2011-11-30T08:04:58.327 回答
3

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

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

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

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

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

大多数其他类型,包括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 应该如何完成的。

于 2011-12-01T00:45:11.370 回答
2

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

(实际上+=需要任何可迭代的。)

于 2011-11-30T08:04:38.277 回答
2

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

于 2011-11-30T08:12:58.393 回答
0

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

b.append(c)

干杯!

于 2011-11-30T08:07:28.097 回答
0

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

于 2011-11-30T08:10:27.533 回答