2017-11-06 10 views
1

だから、私はこの理解:スライス割り当て、浅い/深いコピー

a_list = [1,2,3] 
b_list = [5,6,7] 
a_list.append(b_list) 

a_listが現在ある[1,2,3, [5,6,7]]

c_list = a_list[:] 
b_list[0] = 1000 
print(a_list, c_list) 

a_list c_listが[1,2,3,[1000,6,7]]

です[1,2,3,[1000,6,7]]

a_listとがa_listに追加された場合、[5,6,7]への参照であり、b_listへの変更はa_listc_listの変化を示すため、は両方とも変更されています。それは良い。あなたが持っているとき

問題がある:

a_list = [1, 2, [1,5,0]] 
b_list = a_list[:] 
a_list[2][1] = 90000 
print(a_list, b_list) 

a_list[1, 2, [1, 90000, 0]]あるとb_list[1, 2, [1, 90000, 0]]です。

b_listがなぜ変更されましたか? b_listは、a_listの浅いコピーであり、参照があれば実際のオブジェクトではなく参照をコピーします。 ただし、a_listにはcopyへの参照はありません。正確な値であり、数字のリストであり、b_listは、a_listの値が全く異なるために変更された場合は変更しないでください。b_listは割り当てによってa_listを指していません。

+1

ネストされたリストは*まだ参照*です。変数は名前付き参照であり、リスト内のインデックスは番号付き参照です。 –

+0

浅いコピーは、元のリストの要素と同じ要素を持つ新しいリストです(*これらの要素のコピーではありません)。再帰的に要素をコピーする場合は、 'copy.deepcopy'を使用してください。 –

答えて

0

Pythonですべてを参考にしています。リストインデックスは単に名前(変数)のような参照です。

したがって、a_list[2]はリストオブジェクトへの参照です。a_list[0]は整数オブジェクトへの参照と同様です。 a_listという浅いコピーを作成しました。つまり、3つの参照がすべて新しいリストオブジェクトにコピーされました。

Ergo、b_list[2]は、別のリストオブジェクトa_list[2]と同じオブジェクトを参照します。 a_list[2]またはb_list[2]でそのリストオブジェクトを変更すると、いずれかを介して変更が表示されます。

参照オブジェクトもコピーする必要がある場合は、ディープコピーを作成します。 copy.deepcopy()を使用すると、すべてを再帰的にコピーしたり、リスト内包を使用して直接ネストされたリストの浅いコピーを作成することができます。

関連する問題