2018.07.17最初、Pythonの変更不能体(イミュータブル)という言葉を聞いて、私はJavaやCなどで用意されている「定数」をイメージしてしまったのですが、変更不能体(イミュータブル)は定数ではありません。他のプログラミング言語で用意されている「定数」は最初に変数を定数として宣言すると、その後、その変数に新しい数値を代入することができません。そのため変更したくない値は定数として宣言しておくと安心です。そもそも、Pythonには「定数」という考え方が存在しないのです。「定数」がないプログラミング言語は少数派(?)なのではないでしょうか。Pythonにおいて数値型や文字列やタプルは変更不能体です。5とすれば、いずれも変数aは整数の「5」に入れ替わります。「変更できるのに変更不能体?」次々と疑問がわいてきます。この疑問は代入した変数の参照先アドレス(id)に注目するとすっきりします。リスト全体を代入すると、再定義になる。「Python♪モヤモヤを解消する明快な用語集」の用語集Top(索引)はこちらです。モヤモヤを解消する明快な用語集を目指します。言葉の定義が「グレー」なものは「グレー」であると解説します。同じ言葉でも、例えば「Python」と「Java」では定義が違うことがあります。その場合、「python」での定義を解説します。参照先のアドレスの意味が分かりにくい方は、この記事を先にお読みください。コンピューターの中で変数はどのように記憶されるのか。参照先のアドレスとは。以下の記事は、この記事と内容がほとんど重複していますが、「本当は変数には参照先のアドレス(id)しか入っていない」ことを説明するために、この記事に手を加えたものです。図が少しだけ難しくなっていますが、変更不能体のどこが変更できないのかはっきりします。変更可能体(mutable、ミュータブル)と変更不能体(immutable、イミュータブル)の分類は以下の通りです。complex)、bool、tuple、str、bytes、frozenset、range()、fileオブジェクト3.数値型は変更不能体ってどういうこと?コード01では変更可能体(ミュータブル)であるリストはa=[3]→[5]と変化します。5print(a)#出力1[5]一方、変更不能体(イミュータブル)である数値型もa=3→5と変化しました。それなのに、なぜリストは変更可能体で、数値型は変更不能体なのでしょうか。実は変更可能体(ミュータブル)とは、部分的に変更可能かどうかで分類します。3)のように部分的に変更することはできません。そもそも整数4は一部を変更するということが不可能です。3とすると、その後、全く変更を受け付けませんが、変更不能体は部分的に変えられないだけなのです。入れ替えることはできるので、「変更不能」という言葉とのギャップから最初は戸惑ってしまいます。5.参照先アドレス(id)次に参照先アドレスに注目して、変更不能体を違った方向から眺めてみます。3]」のような変数aへの値の代入において、参照先のアドレス(id)がどのように変わるかに注目すれば、違いがはっきりします。整数は変更不能体(イミュータブル)です。コード03では変数aを3から5に変更し、それぞれの参照先アドレス(id)を出力します。言う組み込み関数が用意されており、変数が参照しているメモリー上のアドレスを取得することができます。コンピューターのどこに記憶されているかを調べることができるのです。4行目で変数aに5を代入する前と後では変数aの参照先アドレス(id)が変化しています。#数値を代入すると、idは変わってしまう。1784770144では、この状況を図で説明したいと思います。コード03の2行目では変数aに整数3を代入しました。出力3の2行目より、このとき整数3はコンピューターの中で「1784770080番地」に記憶されています。idはコンピューターの中の住所のようなものです。「i番地」としました。次に、変数aに5を代入するとどうなるでしょうか。idは「1784770144番地」に変更されました。3で用意された整数3は放置され、全く新しいk番地に整数5が作られるのです。これは、変更ではなく、変数を新しく定義し直しています。再定義しているのです。整数の代入とは、整数を再定義している「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。Pythonは、JavaやCのように型宣言を行いません。したがって、変数に値を代入したときに変数の型が決定されます。変数に整数を代入し直すということは、型宣言からやりなおしているのです。変更不能体の代入は参照先アドレス(id)が必ず変わるここでのポイントは、既に変更不能体(イミュータブル)が代入されている変数を別の値に変更する場合や、変数に新たに変更不能体を代入する場合には、参照先アドレス(id)が必ず変わることです。変更不能体は変更できないので再定義するしかないのです。タプルの代入の具体例コード04、出力04を見てください。タプルも整数と同じく変更不能体(イミュータブル)なので同様の考え方ができます。#数値を代入すると、idは変わってしまう。2685530866952コード03を図示すると以下のようになります。タプルの内容を変更したいときには、下図のようにタプル全体を代入し直すことでしか内容を変更することはできません。このとき参照先アドレス(id)は変わってしまいます。3)という箱に入れ替わります。変更ではなく、再定義されているのです。タプルは変更不能体(イミュータブル)なので、コード05のように、タプルの要素の一部を変更しようとしてもエラーとなります。一部を変更することはできないのです。コード4はリストの「要素を」を変更した例です。リストの要素をa[0]=5と変更しても、参照先アドレス(id)は変わりません。3]で用意された箱はそのままで、0番目の要素の中身の2が5に変更されるのです。#リストの要素を変更してもidは変わらない。リスト全体を代入すると、再定義になる。ここで注意しなければならないのは、変更可能体(ミュータブル)であっても変更可能体のすべてを入れ替えるような代入をした場合には、参照先アドレス(id)が変わってしまいます。出力07を見ると今度は参照先アドレス(id)が変わっているのが分かります。整数やタプルの時と同様に再定義されているのです。=」という形になっていることに注目しましょう。値」のときは、右辺の値が変更可能体であったとしても再定義されるのです。#リストの要素を変更してもidは変わらない。26855316440406.「参照渡し」「浅いコピー」「深いコピー」の理解が深まるこの違いがわかれば、「参照渡し」「浅いコピー」「深いコピー」を理解する時に役に立つと思います。aでは、参照先だけがaからbに渡されるので、aもbも同じアドレスの数値を参照先としています。aの「要素を」変更すると、bの要素の値も変わってしまいます。#参照渡しなので、aの要素を変更するとbの要素も変わる。2685531749192一方、コード09ではリストの「要素を」変更したのではありません。4行目で再定義されているため参照先のアドレスも変わってしまいます。変数aはそれまで変数aに記憶していた[3]は放置し、別の場所にa=[5]に再定義するので変数bの値はかわりません。#参照渡しでも、リストごと変えるとaだけ値が変わる。[5]は再定義なのでidが変わる。2685531638984いかがでしょうか。参照先アドレス(id)の変化に着目しながら、変更可能体や変更不能体について考えることができれば、少し、違った目でPythonの変数を理解することができるようになります。NumPy配列については、上記のアドレス参照方法とは別の方法がとられていますので、注意が必要です。以下、私が実際に購入したPythonの教材をまとめてみました。Pythonを学習する上で、少しでもお役に立つことができればうれしいです。June関連記事PythonPython♪基本:「宝箱」に保管するテクニックの追加例題。abs()も使うよfor文で繰返し計算を行い、if文により必要なデータを宝箱に保管しておくテクニック記事の追加例題です。次のステップに進もうかと思いましたが、もう少し、例題を解くことにしました。この記事では絶対値を求める関数abs()を使って、誤差を...PythonPython♪本当は変数には参照先のアドレス(id)しか入っていない変数aに整数3を代入するとは、aという名前の箱に整数3を入れるようなイメージですが、実際にはそうではありません。整数オブジェクト3が別のところに独立して生成され、変数aには整数オブジェクトの保存先のアドレス(id)のみが記述されます。この...Python知ったつもりでは怖いPython。私はあまり深い機能は使わないので、以下の(1)~(4)の基本コマンドだけ調べて、少し長めのプログラムを組んでみました。だいたい、どの言語でも以下の(1)~(4)がわかれ...PythonPython♪パッケージは、本を目で追うだけではわかりにくい。パッケージって、プログラムの初心者はあまり使わない(?)ですし、練習でコードを書くのにもフォルダを複数作る必要があり、面倒です。その割に、本を目で追うだけでは、わかったつもりになってしまう内容が多いです。この記事では、初心者が勘違いしたり...PythonPython♪関数に引数で渡された変数の変更が、関数の外側に与える影響。関数の引数(ひきすう)は、関数名の後ろの()の中に記載した変数や値のことで、引数により、関数内部にデータを渡すことができます。関数の内部でこの値を変更したときに、関数の外部にはどの様な影響があるのでしょうか。10.6.数学」に出てくるrandomモジュールの関数を整理してみました。randomモジュールには、他にも、便利な関数が多くありますが、まずは、この記事に出てくる関数から覚えてはいかがで...Python♪コンピューターの変数の記憶には、参照先のアドレスが利用される。Python♪「参照渡し」「浅いコピー」「深いコピー」まずは理屈抜きで覚えよう。Studioが遅いときの対策2020.01.11Kotlin♪環境設定「HAXMがインストールされていません」2020.01.052020.01.08Python♪FEM:部材座標系の要素剛性マトリクス2020.01.04Kotlin♪スマホアプリの言語は、Kotlin、Java、C#、Dart?2020.01.012020.01.13スポンサーリンクスポンサーリンク。