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 は似ています (どちらも不変です) +=

また、あるレベルでは、リストとタプルは似ています (両方とも組み込みのシーケンス型)。したがって+=、リスト LHS で機能する場合、タプル LHS では「なぜ」機能しないのでしょう。

しかし...これは、ひどく直感的ではない矛盾をもたらします。

  1. +=ビルトイン シーケンス タイプ間での演算子の並列使用のサポートの欠如:
  • L += iterableリスト L をその場で変更し、それへの既存の参照が変更を追跡しますが ...
  • T += iterableiterableがタプルでない限り、タプル T に対して TypeError を返し、LHS と RHS が両方ともタプルであると仮定すると、LHS は新しいオブジェクトに置き換えられます。
  1. 2 つの直感的に同一の操作間での意味の変更、+=および+:
  • L += T反復可能な RHS (タプル T) を使用して拡張することにより、リスト L をその場で変更しますが ...
  • L = L + Tタプル T は の左側のオペランド (リスト L) と同じ型ではないため、 TypeError を返し+ます。

そして今、私の質問: Python の世界でこの現象の名前はありますか? それによって、さまざまな考慮事項 (Python の Zen または他の言語哲学、強力な型付け、実用性が純粋さを打ち負かす、直感的な演算子の等価性、可変性、数値 - vs-sequence 型) は、組み込みシーケンス型全体での並列使用の欠如や、上で強調した組み込み型の直観に反する演算子の矛盾など、言語の矛盾と見なすことができるものにつながっていますか?

4

0 に答える 0