サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

Pythonコーディング(注) list編

copy

pythonではすべてのオブジェクトは参照渡しになっています。だからlist等をcopyするときには注意が必要です。

a = [0, 1, 2]
b = a
b[0] = 'Hello'
b
> ['Hello', 1, 2]
a
> ['Hello', 1, 2]
# bを変更するとaも変更されてしまう

これを避けるには copy関数を使うか、aの要素を一つ一つbに保存する(所謂、値渡し)をすれば上手くいきます。

# copyを使用
a = [0, 1, 2]
b = a.copy()
b[0] = 'Hello'
b
> ['Hello', 1, 2]
a
> [0, 1, 2] #aには変化なし

#aの要素を一つずつcopy
b = a[:]
b[0] = 'World'
b
> ['World', 1, 2]
a
> [0, 1, 2]

copyの方が字面的に何をしているのかが分かりやすい気がする。(まぁどちらを使うのかは個人の裁量です)

しかしながら更なる問題が!!

単純なlistならば上記の方法で問題ないのですが、listの中にlistがある場合などは、ただcopyするだけでは内包されるlistがまだ参照渡しであるため、以下の事象が起こります。

a = [[0, 1], [1, 2]]
b = a.copy()
b[0][0] = 'H'
b
> [['H', 1], [1, 2]]
a
> [['H', 1], [1, 2]]
#aも変更されている

なので、こういう時はcopyモジュールのdeepcopyを用います。

import copy

a = [[0, 1], [1, 2]]
b = copy.deepcopy(a)
b[0][0] = 'HEY'
b
> [['HEY', 1], [1, 2]]
a
> [[0, 1], [1, 2]]
# aがそのまま



以上、参考までに...