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)
没有歧义在这里使用什么类型.