python中串联列表和元组的行为不一致

时间:2019-05-30 13:33:53

标签: python list tuples concatenation

当尝试连接列表和元组时,我注意到了一个令人惊讶的行为。

通常,它们不会混合:

(0, 1) + [2, 3]

导致:

  

TypeError:只能将元组(不是“列表”)连接到元组

反之亦然

[0, 1] + (2, 3)

给予:

  

TypeError:只能将列表(而不是“元组”)串联到列表中

到目前为止,没有什么是意外的。 但是,如果您通过“ + =”使用变量分配,列表的行为就会改变!

l = [0, 1]
l += (2, 3)
l

给予

  

[0,1,2,3]

但不适用于元组:

t = (0, 1)
t += [2, 3]
t

仍然产生错误:

  

TypeError:只能将元组(不是“列表”)连接到元组

当然,这里没有实际问题,但我很好奇: 那里发生了什么事?

2 个答案:

答案 0 :(得分:8)

列表的

+=并不期望实际的列表为其右手操作数;它将接受任何可迭代的值。实际上,它是list.extend的运算符版本(接受任意可迭代的值)。

tuple根本没有定义__iadd__,因此t += [2, 3]只是t = t + [2,3]的语法糖,我们已经确认tuple.__add__可以不要将元组和列表一起添加。

答案 1 :(得分:2)

每个部分都有其自身的道理,可以在碰巧发现不一致之处时将它们放在一起。

图元组定义__add__并接受其他元组串联在一起。有道理,您可以将两个相同类型的东西加在一起。列表相同,您可以+将两个列表一起使用。

组是不可变的,因此它们没有定义__iadd__+=)。

列表 是可变的,并定义了一个extend方法,可以接受任何可迭代的。因此,您可以执行以下操作:

lst.extend(map(str, range(42)))

整洁方便。 +=基本上就是这个别名。

所以:

  • tuple + tuple有效
  • list + list有效
  • tuple + list不起作用,因为它们是不同的类型
  • list + tuple也无法正常工作
  • list.extend / list +=适用于任何可迭代的对象,包括元组
  • 元组上的
  • +=被执行为a = a + b,因为它们是不可变的,因此如果ab是不同类型的,则不起作用