今回は、Pythonでリスト(配列)を初期化する方法についてご紹介します。
listを初期化する基本的な方法
Pythonでlistを初期化する際、最も基本的な方法は角括弧([])を使うか、list()関数を使うかの2つです。
角括弧を使う例は以下のとおりです。
1 2 |
my_list = [] print(my_list) |
[]
一方、list()関数を使うと次のように書けます。
1 2 |
my_list = list() print(my_list) |
[]
どちらも空のリストを生成する方法で、好みや可読性に応じて使い分けられます。
さまざまな初期化例
空のリスト以外にも、さまざまな方法で初期値を設定することができます。
特定の値でリストを初期化する
同じ値を繰り返すリストを作りたい場合は、[値] * 回数という書き方が便利です。
1 2 |
zeros = [0] * 5 print(zeros) |
[0, 0, 0, 0, 0]
この方法は数値や文字列などのイミュータブル(変更不可)なオブジェクトを扱うときに特に便利です。
リスト内包表記を用いた初期化
要素に処理を加えながら初期化したいときは、リスト内包表記を使うと簡潔に書けます。
1 2 |
squares = [x**2 for x in range(10)] print(squares) |
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
条件を付けたい場合は、if文を使う例もあります。
1 2 |
even_numbers = [x for x in range(20) if x % 2 == 0] print(even_numbers) |
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
ネストされたリストを初期化する
2次元や3次元のようにリストをネストして使う場合は、注意点があります。
以下のように書くと、内部で同じリストが使い回されてしまいます。
1 2 3 4 |
# 正しく動作しない例 matrix = [[0] * 3] * 4 matrix[0][0] = 1 print(matrix) |
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
このように、全ての行が同じオブジェクトを参照してしまい、1行目を変更したら他の行もまとめて変更されるという問題が生じます。
正しい書き方はリスト内包表記を使う方法です。
1 2 3 |
matrix = [[0] * 3 for _ in range(4)] matrix[0][0] = 1 print(matrix) |
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
よくあるエラーや注意点
リストを初期化するときに起きやすいエラーや、後から気付くことがある注意点を整理します。
- リストの乗算(例:[obj] * n)は、イミュータブルなオブジェクトに対しては問題ありませんが、リストや辞書などミュータブル(変更可能)なオブジェクトでは要素が共有されることがあります。
- ネストされたリストの場合、リスト内包表記などを使い、各要素が独立したリストになるように初期化することが重要です。
- リストのコピーを行うときも、浅いコピー(Shallow Copy)やスライスを使うとネストしたオブジェクトが共有されるため、注意が必要です。
まとめ
Pythonでは角括弧やlist()関数を使った空リストの初期化に加え、リスト内包表記や乗算を活用して便利に初期化できます。
ただし、ネストされたリストなどミュータブルな要素を含む場合は、同じオブジェクトを参照しないような書き方を選ぶ必要があります。
初期化方法を誤ると予期しない動作を引き起こすため、リスト構造や要素の性質を考慮して選択することが大切です。