1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】リストをコピーすると要素がリンクしてしまう問題の解決策

Last updated at Posted at 2019-12-22

はじめに

<バージョン>
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]
1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?