为什么在将字符串添加到列表时,增强赋值行为会有所不同

14 浏览
0 Comments

为什么在将字符串添加到列表时,增强赋值行为会有所不同

我现在处于一个非常有趣的情况,感到非常惊讶。

实际上,我以为i += 1 和 i = i + 1 是一样的,但在这里它们不一样;

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

输出结果是[1,2,"a","l","i"]

但如果我这样写;

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

就不行了。

我真的对此感到困惑。

它们是不同的吗?

0
0 Comments

在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错误的出现。

0
0 Comments

在Python中,如果你将一个整数a = 4声明为整数,然后执行a += 5.4a将变为9,而a = a + 5.4会报错。

这是因为a += ba = a + b并不相同。在Python中,a += b实际上是a.__iadd__(b),而a = a + ba = a.__add__(b),或者如果不存在__add__方法,则是a = b.__radd__(a)

你不能使用+将列表和字符串相加,所以第二种代码不起作用,但+=起作用,因为它会自动将某些类型转换为其他类型,即将可迭代对象相互转换。你不能这样做a = []; a += "",但你可以反过来做,因为你可以使用list("...")将字符串无歧义地转换为列表。

0
0 Comments

为什么当将字符串添加到列表时,增强赋值行为会有所不同?

简短回答:

"+"运算符用于连接列表,而"+="运算符用于将可迭代对象扩展到列表中。

长篇回答:

"+"运算符用于连接列表,返回一个新的列表...

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 # []

这样就可以实现将字符串添加到列表的目的。

0