目標
「二次元リスト」(他言語の二次元配列に相当)について理解する。
「シャローコピー」と「ディープコピー」について理解する。
(pythonの)「リスト」の行列表現
二次元リストの作成方法
二次元リストはブラケットを利用して次のように作成することができます。
list_num1 = [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] ]
二次元リストのインデックス
二次元リストや三次元リストのように多次元でのリストのインデックスは外側にあるリストのインデックスを左から順番に記述することで指定できます。
記入例
list_num1 = [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] ]
print(list_num1[ 1 ][ 2 ])
上(list_num1[ 1 ][ 2 ])のように記述するとlist_num1が参照するリストのインデックス1番([4, 5, 6])を指定して、そのあと、[4, 5, 6]の2番目の要素「6」を指定することになります。
変数と二次元リストとの関係
「変数」は「オブジェクト」を結びつけるための名前でした。そして、この名前を利用したリスト(オブジェクト)の参照を図で示すと次のようになります。
上のキャプチャの通り、変数名はリストそのものを参照します(赤矢印)。そして、リストのそれぞれの値も参照(黒矢印)となっています。黒矢印は変数名からの参照ではありません。
二次元リストでも、この関係を維持することになります。二次元リストでは次のように表現できます。
「シャローコピー」と「ディープコピー」
「シャローコピー」
シャローコピー…新規の複合オブジェクトを作成し、中身にはコピー元がもつオブジェクトへの参照がコピーされます。
シャローコピーについては次の記事で確認できます。シャローコピーはミュータブルなイテラブルオブジェクト(リスト、辞書、集合)がもつcopyメソッドを利用して作成できます。
「ディープコピー」
ディープコピー…新規の複合オブジェクトを作成し、中身にはコピー元のもつオブジェクトへの参照がコピーされ、更に中身に複合オブジェクト存在する場合は複合オブジェクト自体もコピーします。
import copy
list_num = [ 6, 3, 10, [8, 9]]
list_copy = copy.deepcopy(list_num)
print('要素の変更前')
print(list_num)
print(list_copy)
list_num[ 0 ] = 5
list_num[ 3 ][ 1 ] = 7
print('要素の変更後')
print(list_num)
print(list_copy)
実行結果
実行結果はシャローコピーの時とは異なり、list_num[ 3 ][ 1 ] = 7 部分でlist_num のみ変更が反映され、list_copyには影響(反映)は行われていません。これは、内側の複合オブジェクトのコピーが行われていることにより、そこへの参照をlist_numが示す緑色のオブジェクトではなく、list_copyが新たにもつ緑色のオブジェクトを辿って其々が、値へアクセスできるようになっているためです。
このうち、list_num[ 0 ] = 5、list_num[ 3 ][ 1 ] = 7 と変更した結果は次のように参照が変更されます。
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。