6

我处于一个非常有趣的境地,我感到非常惊讶。实际上我认为两者i += 1 and i = i + 1都是一样的。但这里不一样;

a = [1,2]
a += "ali"

output is [1,2,"a","l","i"]

但如果我这样写;

a = [1,2]
a = a + "ali"

它不起作用。

我真的很困惑。他们有什么不同吗?

4

3 回答 3

4

简短的回答

+运算符连接列表,而运算+=符扩展具有可迭代的列表。

长答案

+运算符连接列表以返回新列表...

l1 = l2 = []
l1 = l1 + [1]

l1 # [1]
l2 # []

...而+=操作员通过改变列表来扩展列表。

l1 = l2 = []
l1 += [1]

l1 # [1]
l2 # [1]

允许不同行为的是在+调用__add__方法的同时+=调用__iadd__方法。

在您的示例中,您为该方法提供了一个字符串__iadd__,这相当于做l.extend('ali'). 特别是,您可以使用任何可迭代的列表来扩展列表,但连接参数必须都是列表。

虽然和之间存在细微差别。前者返回变异列表,而后者不返回。list.__iadd__list.extend

于 2018-05-23T20:32:59.880 回答
0

在 python 中,由于你不能声明静态类型,所以这种行为不会出现,但是如果你看 C++,如果你声明int a = 4为整数然后 do a += 5.4a会变成9,而a = a + 5.4会中断。

a += b这样做的原因a = a + b是不一样的。在 python 术语中,a += bis justa.__iadd__(b)a = a + bis a = a.__add__(b),或者如果不存在,a = b.__radd__(a). 您不能使用将列表和字符串添加在一起,+因此第二个代码不起作用,但可以工作,+=因为它会自动将某些类型相互转换,即将可迭代对象相互转换。您不能这样做a = []; a += "",但反之亦然,因为您可以使用list("...").

于 2018-05-23T19:53:08.123 回答
0
>>> a = [1,2]
>>> a = a + "ali"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list

对于列表数据类型,请使用以下.append方法:

>>> a = [1,2]
>>> a.append("ali")
>>> a
[1, 2, 'ali']

Python中的字符串被定义为一行中的一系列字符。因此,这些“字符”作为字符添加到“列表”类型,而不是作为“字符串”。当您想+=对列表类型使用加法运算符时,您必须使用方括号指定添加的变量或值的类型:

>>> a = [1,2]
>>> a += ["ali"]
>>> a
[1, 2, 'ali']

>>> a += ["foo",3,"bar"]
>>> a
[1, 2, 'ali', 'foo', 3, 'bar']
于 2018-05-23T19:58:31.447 回答