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

标签 python operator-overloading language-design 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

在语言中提供这样的支持有什么缺点?请注意,我希望这是对称的:[1, 2] + (3, 4)(1, 2) + [3, 4] 都会计算到一个全新的列表 [1, 2, 3, 4]。我的理由是,一旦有人将运算符 + 应用于元组和列表的混合,他们很可能会再次这样做(很可能在同一个表达式中),因此我们不妨提供列表以避免额外的转换。

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

我经常有一些小集合,我更喜欢将它们存储为元组以避免意外修改并提高性能。然后我需要将这些元组与列表结合起来,并且必须将它们中的每一个都转换为列表使得代码非常难看。

请注意,+=extend 可能适用于简单的情况。但一般来说,当我有一个表达

columns = default_columns + columns_from_user + calculated_columns

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

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

或者使用 itertools:

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

这两种解决方案都比简单的加法难看;并且 chain 也可能更慢(因为它必须一次遍历输入一个元素)。

最佳答案

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

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

不过,以下是可行的:

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

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

关于python - 为什么我不能在 Python 中使用 '+' 运算符将元组添加到列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9897070/

相关文章:

python - 如何使用 Pandas 交换列中的两个(字符串)值

C++ 运算符通过模板优化

c++ - 为什么编译需要这么长时间?

Python - 在字符串中查找子字符串(代码不起作用)

python - 如何在 julia 中使用 python regexp 模块

c++ - C++ 中的运算符重载 = operator

c# - 重载 + 运算符,因此它对在已检查或未检查的上下文中被调用很敏感

oop - 为什么 Rust 不支持 trait 对象向上转换?

c# - 为什么 C# 允许没有前置语句的 {} 代码块?

Python:re.sub 条件不起作用