【发布时间】:2012-03-27 20:20:35
【问题描述】:
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 也可能更慢(因为它必须一次遍历一个元素的输入)。
【问题讨论】:
-
保持一致怎么样?使用元组或列表,但不能同时使用。
-
如果它被支持完全我同意这将是最好的行为,但我认为如果有人这样做
2 + 'abc'他们显然想要'2abc'所以为什么不允许它,等等等等——它的解释太多了。显式优于隐式。 -
你可以简单地使用
itertools.chain来链接你的东西,而不是使用+。 -
我想说你的论点中的弱点是“他们可能再做一次”。
-
你不能这样链接
extends。你必须.extend(chain(...))。
标签: python operator-overloading language-design internals