シーケンスの+、*、+=、*=について

1885 ワード

シーケンスは、+および*の動作をサポートする.通常、+番の両側のシーケンスは同じタイプのデータで構成されており、接合中に2つの操作されたシーケンスは変更されず、Pythonは同じタイプのデータを含むシーケンスを接合の結果として新規作成します.1つのシーケンスをいくつかコピーしてつなぎ合わせる場合は、*を使用します.
>>> l = [1, 2, 3]
>>> l * 5
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 5 * 'abcd'
'abcdabcdabcdabcdabcd'

ただし、シーケンスを乗算する場合は、シーケンス内の要素が他の可変オブジェクトの参照であれば、予想外の結果が現れることに注意してください.
>>> weird_board = [['_'] * 3] * 3 
>>> weird_board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> weird_board[1][2] = 'O' 
>>> weird_board
#                    ,      3            
[['_', '_', 'O'], ['_', '_', 'O'], ['_', '_', 'O']]

上のコードは下のコードに等しい
row=['_'] * 3
board = []
for i in range(3):
    board.append(row) 

次は正しいコードのデモです.
 board = [['_'] * 3 for i in range(3)]

上のコードは下のコードに等しい
board = []
for i in range(3):
    row=['_'] * 3
    board.append(row)

増分割付演算子+=および*=の表現は、それらの最初の操作対象に依存する.以下では、+=*=についてのみ説明する.+=の背後にある特殊な方法は__iadd__(その場で加算)であるが、クラスがこの方法を実装していない場合、__add__は一歩後退して呼び出される.また、可変シーケンスについては、上述したインクリメンタル動作はサポートされていない.以下の例から分かるように,可変シーケンスはインクリメンタル乗算を用いた後もIDは変わらず,新しい要素がリストに追加される.しかし,可変シーケンスメタグループは増分乗算を用いた後,新しいメタグループを作成した.(もちろんstrは例外であり、CPythonはそれを最適化し、インクリメンタル操作を行うと新しい可変シーケンスは生成されません)
l = [1, 2, 3]
print(id(l))
l += [4, 5, 6]
print(id(l))

l = (1, 2, 3)
print(id(l))
l += (4, 5, 6)
print(id(l))

47609336
47609336
9051392
9071280