はじめに
<バージョン>
Python: 3.7.4
値をコピーする感覚と同様に、リストaをリストbにコピーして、
リストbの真ん中の要素だけ変更したとします。
copy_test.py
a = [1, 2, 3, 4, 5]
b = a
b[2] =5
print(a)
print(b)
実行結果(失敗例)
なぜかリストaの真ん中の要素も変化してしまいます。
出力
[1, 2, 5, 4, 5]
[1, 2, 5, 4, 5]
解決策1:copyモジュールを使う
copyモジュールを使うと、リストaとリストbがリンクしなくなります。
copy_test2.py
import copy
a = [1, 2, 3, 4, 5]
b = copy.deepcopy(a)
b[2] =5
print(a)
print(b)
解決策2:スライスを使う
a[:]と記載すると要素内の全てがリストbに受け渡されます。
copy_test3.py
a = [1, 2, 3, 4, 5]
b = a[:]
b[2] =5
print(a)
print(b)
<2019/12/22:shiracamus様より>
copy.deepcopy は 完全なコピーをつくりますが、copy.copy やスライスによるコピーはシャローコピーで、
多重リストの場合には影響が残ります。
→解決策2は多重リストの場合では使えないようです。
copy_test4.py
a = [[1], [2], [3], [4], [5]]
b = a[:]
b[2][0] = 5
print(a)
print(b)
ご指摘の通り、多重リストだと結果がリンクしてしまいます。
出力
[[1], [2], [5], [4], [5]]
[[1], [2], [5], [4], [5]]
実行結果(成功例)
想定通り、リストbの真ん中の要素だけ変更されました。
解決策2には多重リストで使えないという問題があるので、解決策1を使う方が無難なようです。
出力
[1, 2, 3, 4, 5]
[1, 2, 5, 4, 5]