Python 文法 リスト,辞書型の代入する時に気をつけるたった1つのこと

2017年11月9日

▼プログラミングスキルへを身に着けて独立しよう!▼


f:id:kichie_com:20171108071806p:plain

値は値が、リストは参照が代入される

こんにちは、きちえです。
まずはターミナルで

python

を入力し、インタラクティブシェルでこちらを入力していただきたい。

number = [0,1,2,3,4]
more_one = number
number[1] = 'hello'
number
#出力:[0, 'hello', 2, 3, 4]
more_one
#出力:[0, 'hello', 2, 3, 4]

ひょっとすると変に見えるかもしれません。

more_oneのリストしか変えていないのに、numberのリストの値も変わってしまいました。

この結果からわかることは、リストの代入の場合は値が代入されるのではなくリストの参照(IDのようなもの)が代入されるということです。

この情報だけを知ると値とリストの概念は少し違うように思えますが実は一緒です。

変数は良く箱と称されますが、値の代入の場合、値そのものが格納されます。
リストの場合は

number = [0,1,2,3,4]

どうすればリスト自体をコピーできるのか?

copyモジュールのcopy()関数を使うと値自体をコピーすることができます。

以下のコードをインタラクティブシェルで実行してください。

import copy
number = [0,1,2,3,4]
more_one = copy.copy(number)
more_one[1] = 'fix'
more_one
#出力:[0, 'fix', 2, 3, 4]
number
#出力:[0, 1, 2, 3, 4]

copy()関数を使うことによってnumberリストの値自体がコピーされ、どこかに保存されます。そして、more_oneに新しくコピーされた値の参照が格納されます。

リストの中にリストがある場合はdeepcopy()

リストの中にリストがあるものをコピーする場合はcopy()の代わりに、depcopy()の関数を使用する。

以下のコードをインタラクティブシェルで実行してください。

team = [[0,1],[2,3,4],[5,6,7]]
new_team = copy.deepcopy(team)
new_team[0] = [10,20]
new_team
#出力:[[10, 20], [2, 3, 4], [5, 6, 7]]
team
[[0, 1], [2, 3, 4], [5, 6, 7]]

まとめ

変数への代入をする時は、
値の自体が代入される
リストの場合は参照が代入される。
そのため、別の変数に代入する場合も同じように参照が代入される。

値自体をコピーしたい場合はimport copyをしてcopu()関数を使用する。

以上

もっと実践的なプログラミングスキルをつけたい方はTECH::CAMPで!無料体験!

質問もすぐにできて、効率よく勉強できるノウハウがあるから時間のないあなたにおすすめ! 公式サイトはこちらから