シーケンスの+、*、+=、*=について
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