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

max*_*max 4 python language-design operator-overloading internals

Python不支持向列表添加元组:

>>> [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
Run Code Online (Sandbox Code Playgroud)

在语言中提供这种支持有哪些缺点?请注意,我希望这是对称的:[1, 2] + (3, 4)并且(1, 2) + [3, 4]都会评估到一个全新的列表[1, 2, 3, 4].我的理由是,一旦有人将operator +应用于元组和列表的混合,他们很可能会再次(很可能在同一个表达式中),所以我们不妨提供列表以避免额外的转换.

这是我对这个问题的动机.

经常发生的事情是我有一些小集合,我更喜欢将它们存储为元组以避免意外修改并帮助提高性能.然后我需要将这些元组与列表组合在一起,并且必须将它们中的每一个转换为列表才能生成非常难看的代码.

请注意,+=或者extend可以在简单的情况下工作.但总的来说,当我有表达时

columns = default_columns + columns_from_user + calculated_columns
Run Code Online (Sandbox Code Playgroud)

我不知道哪些是元组,哪些是列表.所以我要么必须将所有内容转换为列表:

columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)
Run Code Online (Sandbox Code Playgroud)

或者使用itertools:

columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))
Run Code Online (Sandbox Code Playgroud)

这两种解决方案都比简单的总和更为丑陋; 并且chain也可能更慢(因为它必须一次遍历输入一个元素).

Sve*_*ach 10

这不受支持,因为+运算符应该是对称的.你期望什么回报类型?Python Zen包含规则

In the face of ambiguity, refuse the temptation to guess.
Run Code Online (Sandbox Code Playgroud)

但以下工作如下:

a = [1, 2, 3]
a += (4, 5, 6)
Run Code Online (Sandbox Code Playgroud)

没有歧义在这里使用什么类型.

  • @max:我不明白为什么这应该总是返回一个列表.我很高兴Python在这种情况下抛出错误,我相信这不会改变. (3认同)