与えられた:
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 は似ています (どちらも不変です) +=
。
また、あるレベルでは、リストとタプルは似ています (両方とも組み込みのシーケンス型)。したがって+=
、リスト LHS で機能する場合、タプル LHS では「なぜ」機能しないのでしょう。
しかし...これは、ひどく直感的ではない矛盾をもたらします。
+=
ビルトイン シーケンス タイプ間での演算子の並列使用のサポートの欠如:
L += iterable
リスト L をその場で変更し、それへの既存の参照が変更を追跡しますが、 ...T += iterable
iterableがタプルでない限り、タプル T に対して TypeError を返し、LHS と RHS が両方ともタプルであると仮定すると、LHS は新しいオブジェクトに置き換えられます。
- 2 つの直感的に同一の操作間での意味の変更、
+=
および+
:
L += T
反復可能な RHS (タプル T) を使用して拡張することにより、リスト L をその場で変更しますが、 ...L = L + T
タプル T は の左側のオペランド (リスト L) と同じ型ではないため、 TypeError を返し+
ます。
そして今、私の質問: Python の世界でこの現象の名前はありますか? それによって、さまざまな考慮事項 (Python の Zen または他の言語哲学、強力な型付け、実用性が純粋さを打ち負かす、直感的な演算子の等価性、可変性、数値 - vs-sequence 型) は、組み込みシーケンス型全体での並列使用の欠如や、上で強調した組み込み型の直観に反する演算子の矛盾など、言語の矛盾と見なすことができるものにつながっていますか?