かべぎわブログ

技術的なことについてかけたらいいな…

Pythonの参照渡しでハマったのでその対処法

概要

Pythonの参照渡しでハマってしまった。

なにがおきたか

以下のようなプログラムがあったとする。

wawawa_array = ['wa1','wa2','wa3']

sasasa_array = wawawa_array
sasasa_array[0] = 'sa1'

print(wawawa_array)
print(sasasa_array)

これを実行するとこうなってしまう。

['sa1', 'wa2', 'wa3']
['sa1', 'wa2', 'wa3']

sasasa_array[0]を変更したらwawawa_array[0]の値も変わってしまった。

これはなぜか

Pythonではリストの参照を変数に代入している。
データの存在する場所を変数に渡しているため、このような結果になってしまう。

つまりwawawa_arrayとsasasa_arrayは同じリストを参照しているということ。

対処法

Pythonではcopyモジュールというものがあります。
以下のようにすることで別々のリストを参照するようになり、もとのリスト(wawawa_array)には影響を及ぼさないようになります。

from copy import copy

wawawa_array = ['wa1','wa2','wa3']

sasasa_array = copy(wawawa_array)
sasasa_array[0] = 'sa1'

print(wawawa_array)
print(sasasa_array)

実行してみるとこんなかんじでsasasa_arrayだけが変更されていることがわかる。

['wa1', 'wa2', 'wa3']
['sa1', 'wa2', 'wa3']

おわりに

注意せねば

入門 Python 3

入門 Python 3