我处于一个非常有趣的境地,我感到非常惊讶。实际上我认为两者i += 1 and i = i + 1
都是一样的。但这里不一样;
a = [1,2]
a += "ali"
和output is [1,2,"a","l","i"]
但如果我这样写;
a = [1,2]
a = a + "ali"
它不起作用。
我真的很困惑。他们有什么不同吗?
我处于一个非常有趣的境地,我感到非常惊讶。实际上我认为两者i += 1 and i = i + 1
都是一样的。但这里不一样;
a = [1,2]
a += "ali"
和output is [1,2,"a","l","i"]
但如果我这样写;
a = [1,2]
a = a + "ali"
它不起作用。
我真的很困惑。他们有什么不同吗?
+
运算符连接列表,而运算+=
符扩展具有可迭代的列表。
+
运算符连接列表以返回新列表...
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
在 python 中,由于你不能声明静态类型,所以这种行为不会出现,但是如果你看 C++,如果你声明int a = 4
为整数然后 do a += 5.4
,a
会变成9
,而a = a + 5.4
会中断。
a += b
这样做的原因a = a + b
是不一样的。在 python 术语中,a += b
is justa.__iadd__(b)
和a = a + b
is a = a.__add__(b)
,或者如果不存在,a = b.__radd__(a)
. 您不能使用将列表和字符串添加在一起,+
因此第二个代码不起作用,但可以工作,+=
因为它会自动将某些类型相互转换,即将可迭代对象相互转换。您不能这样做a = []; a += ""
,但反之亦然,因为您可以使用list("...")
.
>>> 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']