鉴于:
L, M = [True], [False] # lists
T, U = (False,), (True,) # tuples
以下语句使用+
,+=
和extend()
是可以的:
N = L + M # concatenates two lists with the resulting list assigned to LHS
V = T + U # concatenates two tuples with the resulting tuple assigned to LHS
M += L # extend LHS list using RHS iterable (a list)
L += T # extend LHS list using RHS iterable (a tuple)
M.extend(L) # extend list object using iterable argument (a list)
L.extend(T) # extend list object using iterable argument (a tuple)
U += T # appears to concatenate two tuples: RHS concatenated to original LHS, result gets assigned to LHS
但是,这些语句会导致错误:
L = L + T # TypeError: can only concatenate list (not "tuple") to list
T = T + L # TypeError: can only concatenate tuple (not "list") to tuple
T += L # TypeError: can only concatenate tuple (not "list") to tuple
T.extend(U) # AttributeError: 'tuple' object has no attribute 'extend'
我知道+=
为 int 等不可变数字类型工作是为了方便起见(尽管它意味着与 C/C++ 中的类似运算符不同的东西,例如)。而且我知道+=
接受具有可变序列类型(列表)的可迭代 RHS 作为 LHS 很方便。
在某种程度上,int 和 tuple 是相似的(都是不可变的),因此如果+=
适用于 int,那么“为什么不”适用于 tuple。
并且在某种程度上,列表和元组是相似的(都是内置的序列类型),因此如果+=
与列表 LHS 一起使用,那么对于元组 LHS 来说“为什么不”。
但是......这会导致一些不太直观的不一致:
+=
跨内置序列类型的运算符缺乏并行使用支持:
L += iterable
就地修改列表 L 并且对它的现有引用跟踪更改,而...T += iterable
给元组 T 一个 TypeError 除非iterable是一个元组,并且假设 LHS 和 RHS 都是元组,LHS 被一个新对象替换。
- 两个直观相同的操作的含义变化,
+=
并且+
:
L += T
通过使用可迭代 RHS(元组 T)扩展列表 L 来修改列表 L,而...L = L + T
给出一个 TypeError 因为元组 T 与 的左操作数(列表 L)的类型不同+
。
现在,我的问题是:在 Python 世界中,这种现象是否有一个名称,是各种考虑因素的碰撞(Python 之禅或其他语言哲学、强类型、实用性胜过纯粹性、直观的运算符等效性、可变性、数字- vs-sequence types) 导致了可以被视为语言中的不一致之处,例如内置序列类型之间缺乏并行使用,或者上面突出显示的此类内置类型的违反直觉的运算符不一致?