为什么我不能在Python中使用’+’运算符将列表添加到列表中?

Why can't I add a tuple to a list with the '+' operator in Python?

python不支持向列表中添加元组:

1
2
3
4
>>> [1,2,3] + (4,5,6)
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
TypeError: can only concatenate list (not"tuple") to list

提供这种语言支持有什么缺点?注意,我希望这是对称的:[1, 2] + (3, 4)(1, 2) + [3, 4]都将评估为一个全新的清单[1, 2, 3, 4]。我的基本原理是,一旦有人将operator+应用到元组和列表的组合中,他们很可能会再次这样做(很可能在同一表达式中),所以我们也可以提供列表以避免额外的转换。

这是我提出这个问题的动机。

经常会发生这样的情况:为了避免意外的修改和提高性能,我喜欢将小集合存储为元组。然后,我需要将这些元组与列表结合起来,并且必须将它们中的每一个都转换为列表,这就产生了非常难看的代码。

注意,+=extend可能在简单情况下起作用。但总的来说,当我有一个表情

1
columns = default_columns + columns_from_user + calculated_columns

我不知道哪一个是元组,哪一个是列表。所以我要么把所有的东西都转换成列表:

1
columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)

或使用ITertools:

1
columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))

这两种解决方案都比简单的和更糟糕;而且chain也可能较慢(因为它必须一次迭代一个元素的输入)。


这是不支持的,因为+运算符应该是对称的。您想要什么样的退货类型?python zen包含规则

1
In the face of ambiguity, refuse the temptation to guess.

但是,以下工作是:

1
2
a = [1, 2, 3]
a += (4, 5, 6)

这里不存在使用什么类型的含糊不清。


为什么python不支持添加不同的类型:简单的答案是它们是不同的类型,如果您试图添加一个iterable并期望一个列表出来呢?我自己也很想再来一个。还考虑到['a','b']+'cd'的输出应该是什么?考虑到显式比隐式更好,所有这样的隐式转换都是不允许的。

为了克服这一限制,请使用extend列表方法添加任何ITerable,例如

1
2
l = [1,2,3]
l.extend((4,5,6))

如果必须添加许多列表/元组,请编写一个函数

1
2
3
4
5
6
7
def adder(*iterables):
    l = []
    for i in iterables:
        l.extend(i)
    return l

print adder([1,2,3], (3,4,5), range(6,10))

输出:

1
[1, 2, 3, 3, 4, 5, 6, 7, 8, 9]


如果这有助于:

1
2
3
4
>>> x = [1,2,3]
>>> x += (1,2,3)
>>> x
[1, 2, 3, 1, 2, 3]

您也可以显式使用列表构造函数,但正如您所提到的,可读性可能会受到影响:

1
2
>>> list((1,2,3)) + list((1,2,3))
[1, 2, 3, 1, 2, 3]