Pythonの参照渡しとは?仕組みや回避方法についてわかりやすく解説!

今回はリストや辞書などのオブジェクトの操作する際に発生する参照渡しの回避方法について解説いたします。

オリジナルのオブジェクトと同じ値を持った変数が欲しいだけなのに、新しく用意した変数をいじったら元のオブジェクトの値も変わってしまったという事象が発生してどうしたら良いのかわからないという人もいるかと思います。

そのため、なぜこのような現象が起きてしまうのか、どうしたら解消できるのかについてわかりやすく解説いたします。

今回の内容ハイライト

1. 参照渡しの仕組みについて
2. リストや辞書には list.copy()を使う!
3. copy 関数を使って copy.copy(list) とする方法もある!

スポンサーリンク
目次

参照渡しとは

まずは参照渡しがどういうものかについて簡単に説明します。

Pythonでは辞書やリストなどのオブジェクトには、変数という箱の中にリスト等のデータがそのまま入っているのではなくデータの所在をしめす住所のようなものが入っております。

つまり変数では実際のデータを住所票のようなもので参照しているだけであり、リストの値そのものが変数の中に入っているというわけではないのです。

こうして変数にいれて用意したリストを複製したい場合、「new_list = ori_list」のようにすると思います。
この時、変数の中では以下のようにデータの参照先を示す住所票のコピーだけがおこなわれます。

これが参照渡しです。

こうして参照渡しされた変数を 「new_list[0] = 100」のように変更した場合は、参照先の値が変わってしまうので同じデータを参照している new_list と ori_list の両方に影響が出てしまいます。

これが参照渡しの弊害であり、「あれ?新しいほうのリストを変更しただけなのに、元のリストもかわってるじゃん!」となる現象の正体です。

実際に参照渡しが確認できるコードが以下になりますので、興味があったら Colab 等で実行してみてください。

リストや辞書の参照渡しの回避方法

リストや辞書の参照渡しを回避する方法はいたって簡単です。
copy 関数を利用する、もしくは copy ライブラリを利用することで回避することができます。

copy関数を使った参照渡しの方法

copy関数を使った場合以下のようにしてリストを参照渡しを回避した状態で生成することができます。

上記のコードを実行してもらえればわかる通り、list の copy 関数を利用することで [ori_list] の内容が上書きされずに出力されていることがわかると思います。

copy 関数は リストや辞書のオブジェクトに含まれている関数ですので、特にライブラリのインポート等は必要ありません。

copy ライブラリを使った参照渡しの回避方法

次は copy ライブラリというもとからPythonに備わっている組み込みの関数を利用した方法になります。
そのため、新規にライブラリのインストールをするといったことは必要ありません。

copy関数の使い方は以下のようになります。

上記のようにしてコピー関数を用いれば参照渡しを回避してリストを複製することができます。

いかがでしょうか。
オブジェクトの参照回避は基本はコピー関数を使えば何とかなるということだけ気にしていれば大丈夫かと思います。
また参照渡しの理解に躓いている人は今回の内容で少しでも理解の助けになれたなら幸いです。

今回はここまでです。
お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる