2

鉴于:

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 来说“为什么不”。

但是......这会导致一些不太直观的不一致:

  1. +=跨内置序列类型的运算符缺乏并行使用支持:
  • L += iterable就地修改列表 L 并且对它的现有引用跟踪更改,...
  • T += iterable给元组 T 一个 TypeError 除非iterable是一个元组,并且假设 LHS 和 RHS 都是元组,LHS 被一个新对象替换。
  1. 两个直观相同的操作的含义变化,+=并且+
  • L += T通过使用可迭代 RHS(元组 T)扩展列表 L 来修改列表 L,...
  • L = L + T给出一个 TypeError 因为元组 T 与 的左操作数(列表 L)的类型不同+

现在,我的问题是:在 Python 世界中,这种现象是否有一个名称,是各种考虑因素的碰撞(Python 之禅或其他语言哲学、强类型、实用性胜过纯粹性、直观的运算符等效性、可变性、数字- vs-sequence types) 导致了可以被视为语言中的不一致之处,例如内置序列类型之间缺乏并行使用,或者上面突出显示的此类内置类型的违反直觉的运算符不一致?

4

0 回答 0