为什么在将字符串添加到列表时,增强赋值行为会有所不同
在Python中,当我们将字符串与列表相加时,会出现不同的行为。上述代码中,当我们尝试将字符串"ali"与列表a相加时,会出现TypeError: can only concatenate list (not "str") to list的错误。
出现这个错误的原因是,Python中的字符串被定义为连续的字符序列。所以,这些"字符"被添加到"列表"类型中时,被当作字符添加,而不是作为字符串。因此,当我们想要使用+=操作符将字符串添加到列表类型时,我们必须使用方括号来指定添加变量或值的类型。
解决这个问题的方法是使用列表的append()方法。这个方法可以将一个元素添加到列表的末尾。
另一种解决方法是使用+=操作符来将一个列表添加到另一个列表中。在这种情况下,我们需要使用方括号将要添加的列表或值括起来,以指定其类型。
下面是使用这两种方法修复上述错误的示例代码:
>>> a = [1,2] >>> a.append("ali") >>> a [1, 2, 'ali'] >>> a = [1,2] >>> a += ["ali"] >>> a [1, 2, 'ali'] >>> a += ["foo",3,"bar"] >>> a [1, 2, 'ali', 'foo', 3, 'bar']
通过使用列表的append()方法或使用+=操作符加上方括号来指定要添加的变量或值的类型,我们可以成功将字符串添加到列表中,避免了TypeError错误的出现。
在Python中,如果你将一个整数a = 4
声明为整数,然后执行a += 5.4
,a
将变为9
,而a = a + 5.4
会报错。
这是因为a += b
和a = a + b
并不相同。在Python中,a += b
实际上是a.__iadd__(b)
,而a = a + b
是a = a.__add__(b)
,或者如果不存在__add__
方法,则是a = b.__radd__(a)
。
你不能使用+
将列表和字符串相加,所以第二种代码不起作用,但+=
起作用,因为它会自动将某些类型转换为其他类型,即将可迭代对象相互转换。你不能这样做a = []; a += ""
,但你可以反过来做,因为你可以使用list("...")
将字符串无歧义地转换为列表。
为什么当将字符串添加到列表时,增强赋值行为会有所不同?
简短回答:
"+"运算符用于连接列表,而"+="运算符用于将可迭代对象扩展到列表中。
长篇回答:
"+"运算符用于连接列表,返回一个新的列表...
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"之间有一个细微的差别。前者返回经过修改的列表,而后者不返回。
解决方法:
如果你想使用"+"运算符将字符串添加到列表中,你可以将字符串转化为列表,然后进行连接操作。
l1 = l2 = [] l1 = l1 + list('ali') l1 # ['a', 'l', 'i'] l2 # []
这样就可以实现将字符串添加到列表的目的。