Pythonのリスト(list
)を拡張する方法(extend
メソッド)について解説します。
Contents
Pythonのリスト(list)を拡張するextendメソッド
Pythonでリストを別のリストを使って拡張する場合には、extend
メソッドを使用できます。リストを追加する方法としては、+
演算子や*
演算子、append
メソッドもあるので、それぞれの違いをしっかり把握しておくことも重要です。
本記事では、extend
メソッドの使い方を中心に解説するとともに、+
演算子、*
演算子、append
メソッドとの違いについて説明していきます。
extendの基本的な使い方
既存リストに新しいリストを追加する方法
既存リストに新しいリストを追加して拡張する場合には、以下例のようにextend
メソッドを用いることで簡単に拡張できます。
# listに新しいlistを追加する data = ["A", "B", "C", "D", "E"] add_data = ["F", "G", "H"] print(f"extend実行前 data: {data}, id(data): {id(data)}") data.extend(add_data) print(f"extend実行後 data: {data}, id(data): {id(data)}")
【実行結果】 extend実行前 data: ['A', 'B', 'C', 'D', 'E'], id(data): 2249082115904 extend実行後 data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(data): 2249082115904
※ idの値は実行のたびに変わるため、上記と全く同じ値にはなりません。
上記例の結果を見てみるとextendメソッドによりリストが拡張できていることが分かります。
また、元オブジェクトと異なるかどうか把握するためにid
関数を用いてリストのid
を確認していますが、data
のid
には変化がないので既存list
のdata
にadd_data
の内容が追加されて拡張されていることが分かります。
extendと+演算子、* 演算子との違い
extend
メソッドを使用しない方法として、+
演算子や*
演算子を使用してリストを拡張することも可能です。以降で例を用いて紹介します。
+演算子を用いたリスト(list)の拡張
+
演算子を用いたリストの拡張の使用例について以下に示します。+
演算子は、既存リストに新しいリストを追加したい場合に使用することができます。
# +演算子でlistを追加する。 data = ["A", "B", "C", "D", "E"] add_data = ["F", "G", "H"] new_data = data + add_data print(f"data: {data}, id(data): {id(data)}") print(f"new_data: {new_data}, id(new_data): {id(new_data)}") # +=を使う場合は、結果としてはextendと同じ print("===") print(f"+=実行前 data: {data}, id(data): {id(data)}") data += add_data print(f"+=実行後 data: {data}, id(data): {id(data)}")
【実行結果】 data: ['A', 'B', 'C', 'D', 'E'], id(data): 2003474856128 new_data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(new_data): 2003490920448 === +=実行前 data: ['A', 'B', 'C', 'D', 'E'], id(data): 2003474856128 +=実行後 data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], id(data): 2003474856128
+
演算子を用いて別のリストに代入する場合は、別id
の新しいリストが生成されます。
一方で、+=
演算子を用いてリストを拡張した場合はid
が変わっていないことが分かります。このことから、+=
演算子を用いる方法とextend
メソッドを用いる方法は、同じ結果になるということが分かります。
【extend
と+
演算子の違い】
+
演算子を用いて別変数に入れる場合には、新しいリストが生成される。+=
演算子を用いる場合は、元のリストが拡張されるためextend
メソッドの結果は同じになる。
*演算子を用いたリスト(list)の拡張
*
演算子を用いたリストの拡張の使用例について以下に示します。*
演算子は、既存のリストを複数回繰り返したリストを作成したい場合に使用することができます。
# *演算子でlistを拡張する。 data = ["A", "B", "C"] new_data = data * 3 print(f"data: {data}, id(data): {id(data)}") print(f"new_data: {new_data}, id(new_data): {id(new_data)}") # *=を使って拡張する。 print("===") print(f"*=実行前 data: {data}, id(data): {id(data)}") data *= 3 print(f"*=実行後 data: {data}, id(data): {id(data)}")
【実行結果】 data: ['A', 'B', 'C'], id(data): 1361669142720 new_data: ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], id(new_data): 1361653151872 === *=実行前 data: ['A', 'B', 'C'], id(data): 1361669142720 *=実行後 data: ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], id(data): 1361669142720
+
演算子の場合と同様で、*
演算子を用いて別リストに代入する場合は、別id
の新しいリストが生成されます。一方で、*=
演算子を用いてリストを拡張した場合は、元のリストが拡張されます。
*演算子を用いた拡張の注意点
*
演算子でリストを拡張する場合には注意点があります。
*
演算子でリスト等の変更可能であるミュータブル(mutable)な要素を持つリストで拡張した場合は、参照がコピーされるため元の要素への変更がそのまま反映される。
言葉だと少しわかりにくいかと思いますので、以下の具体例でみていきましょう。
data = [["A", "B"], ["C", "D"]] data *= 3 print(f"data: {data}") # 要素に変更を加える data[0].append("Z") print(f"append後 data: {data}")
【実行結果】 data: [['A', 'B'], ['C', 'D'], ['A', 'B'], ['C', 'D'], ['A', 'B'], ['C', 'D']] append後 data: [['A', 'B', 'Z'], ['C', 'D'], ['A', 'B', 'Z'], ['C', 'D'], ['A', 'B', 'Z'], ['C', 'D']]
上記例では、リストを要素に持つリストを*
演算子で拡張しています。
この時に0
番目要素のリストに"Z"
という文字列をappend
した場合、拡張後のリストの0
番目だけではなく、2
, 4
番目の要素にも"Z"
が追加されていることが分かります。
これは参照をコピーして拡張していることが理由です。このような変更で問題ない場合には良いのですが、拡張後リストの0
番目にのみ変更したかったのだとすると想定外の動作となってしまいます。ミュータブル(mutable)な要素を持つリストで拡張する場合は注意しましょう。
extendとappendの違い
extend
メソッドに似たメソッドとしてappend
メソッドがあります。extend
メソッドとappend
メソッドとでどのように結果が異なるかしっかり理解しておきましょう。
print("===== extendの場合") data = ["A", "B", "C", "D", "E"] add_data = ["F", "G", "H"] data.extend(add_data) print(f"data: {data}") print("\n===== appendの場合") data = ["A", "B", "C", "D", "E"] add_data = ["F", "G", "H"] data.append(add_data) print(f"data: {data}")
【実行結果】 ===== extendの場合 data: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] ===== appendの場合 data: ['A', 'B', 'C', 'D', 'E', ['F', 'G', 'H']]
上記例を見てみると、extend
メソッドの場合は、追加するリストの各要素が順番に既存リストに追加されて拡張されていることが分かります。
一方で、append
メソッドを使用した場合は、5
番目の1要素として["F", "G", "H"]
というリストが追加されていることが分かります。
上記のようなときには、拡張後リストを参照した時の結果が異なってくるのでよく理解して使いましょう。
【extend
とappend
の違い】
extend
の場合は、追加するリストの各要素が既存リストに順番に追加される。append
を用いてリストを追加した場合は、追加するリスト全体が一つの要素として、既存リストに追加される。
まとめ
Pythonのリスト(list
)を拡張する方法について解説しました。
リストを拡張するには、extend
メソッドが使用できます。また、リストの拡張方法としては他にも+
演算子、*
演算子、append
メソッドがありますので、それぞれがextend
メソッドの結果とどのように違うかについても説明しました。
それぞれの方法の特徴をしっかりと押さえてうまくリスト拡張ができるようになりましょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。