Pythonのリストにおける繰り返し演算子(*)の仕組みと使い方を徹底解説
通常、* 記号は掛け算(乗算)を表すために使われますが、左側のオペランドがリストの場合には「繰り返し演算子」として動作します。繰り返し演算子を使うと、リストのコピーを指定回数分作成し、それらをすべて連結した新しいリストを簡単に生成できます。
基本例
まずは、単一の要素を持つリストを繰り返すシンプルな例から見てみましょう。
numbers = [0] * 5 print(numbers)
出力
[0, 0, 0, 0, 0]
このコードでは [0] は要素が1つだけ(値 0)のリストです。* 5 を付けることで、このリストのコピーを5個作成し、それらを1つのリストに連結しています。
複数要素のリストを繰り返す場合
もちろん、複数の要素を持つリストにも同じように使えます。
numbers = [0, 1, 2] * 3 print(numbers)
出力
[0, 1, 2, 0, 1, 2, 0, 1, 2]
元のリストの中身がそのまま順番に3回繰り返されて、新しいリストが作られていることがわかります。
注意点:シャローコピー(浅いコピー)になる
繰り返し演算子で作成されるのは、あくまでリストのシャローコピー(浅いコピー)である点に注意が必要です。これは、リスト自体は複製されますが、内部の要素が可変オブジェクト(別のリストや辞書など)の場合、それらは同じオブジェクトへの参照が共有されることを意味します。
そのため、1箇所で要素を変更すると、繰り返されたすべての場所に同じ変更が反映されてしまいます。
matrix = [[0] * 3] * 2 print(matrix) # [[0, 0, 0], [0, 0, 0]] matrix[0][0] = 9 print(matrix) # [[9, 0, 0], [9, 0, 0]] ← 両方の行が変わってしまう!
意図しない共有を避ける方法
このような挙動が望ましくない場合は、繰り返し演算子で可変要素を含むリストを作らないようにしましょう。代わりにリスト内包表記を使えば、各行が独立した新しいリストとして生成され、問題を回避できます。
matrix = [[0] * 3 for _ in range(2)] matrix[0][0] = 9 print(matrix) # [[9, 0, 0], [0, 0, 0]] ← 意図どおり1行目だけ変わる
まとめると、* による繰り返しは不変(イミュータブル)な要素のリストを手軽に作るのに便利ですが、ネストした可変オブジェクトを扱う場合はシャローコピーの挙動を理解した上で、必要に応じてリスト内包表記などの代替手段を選ぶことが重要です。
-
Pythonにおける正規表現[\d+]の仕組みをわかりやすく解説
Pythonのreモジュールを使うと、文字列から特定のパターンに一致する部分を簡単に抽出できます。本記事では、正規表現「[\d+]」が対象の文字列に対してどのように動作するのか、具体的なコード例とともに解説します。 正規表現「[\d+]」の意味 「[\d+]」は文字クラス([ ])を使用したパターンで、次のいずれか1文字にマッチします。 \d … 半角数字1文字(0〜9) + … プラス記号そのもの ここで重要なのは、通常「+」は「直前のパターンの1回以上の繰り返し」を表す量指定子ですが、角括弧の中では単なるリテラル文字として扱われるという点です。したがって「[\d+]」は「数字または『
-
Pythonにおけるアンダースコア(_)の意味と使い方をわかりやすく解説
Pythonでは、アンダースコア(_)は特別な役割を持つ記号です。一見ただの文字に見えますが、実際にはインタープリタの動作や命名規則、数値リテラルの表記など、さまざまな場面で重要な働きをします。この記事では、Pythonでアンダースコアが使われる主な5つのケースを、コード例とともにわかりやすく解説します。1. インタープリタで直前の式の値を保持するPythonの対話モード(インタープリタ)では、直前に評価した式の結果が、特別な変数「_」に自動的に格納されます。計算結果をすぐに再利用したいときに非常に便利です。使用例>>> 12 + 10 22 >>> _ 2