2018.07.28関数の引数や、関数内からのグローバル変数の参照などは「参照渡し」の考え方が用いられています。この様に参照渡しは様々なところで使われているため、参照渡しが理解できていないと思わぬミスをしてしまいます。この記事では、「参照渡し」だけに注目し、変更不能体(イミュータブル)、リスト、ディクショナリ、集合(set)、NumPy配列の「参照渡し」について整理します。a)は、aの完全な複製をbに渡すわけではありません。データを保管しているアドレスをaからbに渡し、同じ場所に記憶されたデータを共有しているだけです。したがって、参照渡し後に片方の変数を変更すると、もう片方の変数も連動して同じように変更する場合があります。ここで「場合がある」といったのは、連動して変更されない場合もあるからです。「連動する」か「連動しない」かは、「参照渡し」後の変数の変更の仕方によります。結果から言うと、「参照渡し」後に、要素の変更を行うと、もう片方の変数も連動します。「参照渡し」後に、「変数の再定義」を行うと、もう片方の変数は連動しません。この違いは、変更する式の左辺に注目します。」の形になっていれば、それは「変数の再定義」です。「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。片方の変数は連動しない。片方の変数も連動する。それでは、以下、図を用いて違いを説明したいと思います。aでは、変数aの複製を変数bとして作っているのではなく、図のように、アドレスi番地に保管したデータ[3]をaとbで共有します。aでは、参照先のアドレス(i番地)をaからbに渡しただけなのです。」となっており、これは要素の変更です。要素の変更では、[3]の箱の中身を5から3に入れ替えるので、aを変更した場合、bも連動して内容が変更されます。要素の変更では、参照先のアドレスはi番地のまま変わりません。aは、先ほどと同様にアドレスi番地に保管したデータ[3]をaとbで共有します。」となっており、これは変数の再定義です。変数の再定義では、変数aは、それまでの記憶を放置し、全く新しいアドレスk番地に新しい変数aを再定義します。この時点で、変数aと変数bは、なんの関わりもないそれぞれ独立した変数になってしまいます。変更がbに影響をあたえることはありません。ブール型、フローズンセットがありますが、そもそも、変更不能体は変更できないので、そのため再定義するしか方法がなく、他方に影響を与えることはできないのです。リストは変更可能体(ミュータブル)です。これは「変数の再定義」なのです。変数aは、それまでの記憶は放置し、全く新しいアドレスk番地に新しい変数aを再定義します。したがって、変数aと変数bは、なんの関わりもないそれぞれ独立した変数なのです。aの再定義がbに影響をあたえることはありません。このように、単純に「変更可能体(ミュータブル)は、他方の変数も連動する」と覚えてしまうと間違えてしまいます。変更可能体であっても、再定義すると独立した変数になります。これは「再定義」それとも「要素の変更」コード01を見てください。「再定義」なのか、それとも「要素の変更」なのか、注意しないと間違えそうなものを集めてみました。おさらいですが、「再定義」は、データを保管するメモリーのアドレスが変化します。「要素の変更」ではデータを保管するメモリーのアドレスは変化しません。そこでid()関数を使って、「再定義」なのかか「要素の変更」なのかを調べてみます。id()関数は、その変数の参照先のアドレス(データが実際に保管されているメモリーのアドレス)を調べることができるので、「再定義」か「要素の変更」なのかを確認することができます。参照先のアドレス(id)が変わっていれば、「再定義」です。数値は変更不能体(イミュータブル)なので、どんな変更であろうと再定義です。497774208と変化しており、内容の変更を行う度に再定義されていることがわかります。難しいのはリストです。a.append(7)は、参照先アドレス(id)が変化していません。再定義ではなく「要素の変更」なのです。[6]は「要素の変更」なので、注意が必要です。3は「再定義」なのもまぎらわしいです。この様に、「再定義」なのか「要素の変更」なのかを個別に覚えなければならないものもありますので、注意しましょう。a.append(7)まとめ参照渡し後の変数の変更が他方の変数に影響をあたえるかどうかをまとめます。説明しましたが、まとめると単純ですね。この記事の結果は、必ず理解してください。色々なところで役に立つはずです。変更不能体(イミュータブル)「参照渡し」後の、変更不能体の変更は要素の変更ができないため、「変数の再定義」しかなく、片方の変数の変更が他方の変数に影響を与えることはありません。場合も「変数の再定義」以外には変更の手段がありません。片方の変数の変更が、他方の変数に影響を与えることはありません。片方の変数は連動しない。片方の変数も連動する。→これが「要素の変更」になることは覚えよう。→これが「要素の変更」になることは覚えよう。以下、この記事を読めば理解が進む記事を紹介します。Pythonを理解する上で重要だと思いますので、参考記事にも是非、目を通してください。関数に引数で渡された変数の変更が、関数の外側に与える影響。June関連記事PythonPython♪基本:キーボードのキーの名前ゆうちゃんとプログラムの勉強をしているのですが、「あっ、そこ、割るじゃなくて、かける」「えっ、かけるってどれ」「あ~、アスタリスク・・・じゃなくて雪みたいなマークの・・・え~と、これ(直接キーボードを押す)」「リターンキー押して」「リター...PythonPython♪本当は変数には参照先のアドレス(id)しか入っていない変数aに整数3を代入するとは、aという名前の箱に整数3を入れるようなイメージですが、実際にはそうではありません。整数オブジェクト3が別のところに独立して生成され、変数aには整数オブジェクトの保存先のアドレス(id)のみが記述されます。この...Pythonpython♪基本:「クラス」って必要?def関数でいいんじゃない?そもそも、「クラス」って、なんのためにあるのでしょう。python関連の書籍では、「設計図」と表現されることが多いですが「???」です。「設計図」という表現はクラスの機能をうまく例えていますが、クラスを使う優位性はわかりません。そこで、こ...PythonPython♪パッケージは、本を目で追うだけではわかりにくい。パッケージって、プログラムの初心者はあまり使わない(?)ですし、練習でコードを書くのにもフォルダを複数作る必要があり、面倒です。その割に、本を目で追うだけでは、わかったつもりになってしまう内容が多いです。この記事では、初心者が勘違いしたり...PythonPython♪基本:Pythonは変数や引数の宣言が不要。C言語、VBAとの比較Pythonのコードをコード01、C言語のコードをコード02、ExcelのVBAのコードをコード03に示します。それぞれの言語の特徴が出ていると思います。して比べてみると確かにPythonってコードが短いですね。感激するほど短く...PythonPython♪基本:「宝箱」に保管するテクニックの追加例題。abs()も使うよfor文で繰返し計算を行い、if文により必要なデータを宝箱に保管しておくテクニック記事の追加例題です。次のステップに進もうかと思いましたが、もう少し、例題を解くことにしました。この記事では絶対値を求める関数abs()を使って、誤差を...Python♪関数のスコープは3層入れ子構造(ネスト)の具体例で理解しよう。Python♪関数に引数で渡された変数の変更が、関数の外側に与える影響。Studioが遅いときの対策2020.01.11Kotlin♪環境設定「HAXMがインストールされていません」2020.01.052020.01.08Python♪FEM:部材座標系の要素剛性マトリクス2020.01.04Kotlin♪スマホアプリの言語は、Kotlin、Java、C#、Dart?2020.01.012020.01.13スポンサーリンクスポンサーリンク。