ただし、ここで重要なのは、aの変更が、① 変数の「要素を」変更しているのか、それとも、② 変数全体を別の値に入れ替え、「変数の再定義」を行っているのかという点です。, ①変数の要素の変更:ケース01、ケース03 「コメントアウト」 Pythonと他の言語の比較は、ネット上にあふれているので、ここには書きません。  書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!  (1) 「変数の再定義」 紹介特典をご利用される場合は、2020年11月30日 23:59までにNURO 光へのお申し込みを完了する必要があります。.  (1) 「変数の再定義」の時のみ連動しない。 ※左辺が「変数名 =」の形になっている。 python - パンダのマルチインデックスデータフレームにすべての名前付き列をプロットする方法は? python - パンダのデータフレームで最後のIDを見つけて値をインクリメントする; python - 同じキー値を持つ2つの辞書からパンダデータフレームを作成する方法は? 今回は、このような悩みを解決するために、, Pythonでは、リスト(に限らずオブジェクト)を変数に代入する処理は、値そのものを変数に代入するのではなく、リストの「参照」を変数に代入します。, リストaを’=’で変数bに代入すると、Pythonはリストの「参照」を新しい変数bにコピーします。   (1) 「深いコピー」では全ての変更が連動しません。  つまり、浅いコピーでは一番浅い部分の要素の変更a[0]=, a[1]=, a[2]=ではコピー先とコピー元が連動しません。, 図を見るまでもなく、深いコピー後は、aやbのどの様な変更に対しても他方は連動して変更されたりしないので、図は全て実線になっています。, (1) 浅いコピーでb=a[:]の表記はできないため、b=copy.copy(a)とする必要がある。 変更不能体には、数値型、文字列、リスト(list)、ブール型、フローズンセットがあります。変更不能体は、「参照渡し」「浅いコピー」「深いコピー」の区別を考える必要がありません。b=aという表記だけを覚えればよく、コピーの後、それぞれの変数は独立しています。 どうですか?ひとまず、半分ぐらいはすっきりしたでしょ? 関連記事:変更可能体(mutable)と変更不能体(immutable) (参考2:変更不能体のタプルは要素にすることができます。しかし、タプルの要素は変更できませんから、タプル全体を変更するしかなく、深い部分は存在しません。), 変更不能体には、数値型、文字列、リスト(list)、ブール型、フローズンセットがあります。変更不能体は「参照渡し」「浅いコピー」「深いコピー」の、どのコピーを行ったとしても、それぞれ独立した変数として扱えますので、一番簡単で、速く、メモリーも節約できるa = bの書式を用います。, 変更不能体は変更できないので、変数の内容を変えたいときは、変更ではなく、変数を「再定義」するしかありません。「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。 浮動小数点(float)型のデータが整数値かどうかを判定するには、float型が提供しているis_integer()メソッドを使います。本記事では、この関数の使い方についてまとめます。, 辞書(dictionary)はPythonの組み込み型の一つで、マッピング型に属します。key:valueペアの集合を{}で囲って生成します。本記事ではまず、Pythonの辞書の特徴を整理し、その後、項目数やvalueの取得法など辞書の使い方の基本について記載しました。, map()は、イテラブルの要素を任意の関数に渡して新たなイテレータオブジェクトを生成する関数です。例えば、リストの文字列の要素をまとめてint型に変換したりする場合に使えます。同様の機能はforループや内包表記を使って書くことも出来ますが、可読性や実行効率を考慮して使い分けるのが良いと思います。, >Pythonの数値型は整数型(int)、浮動小数点型(float)、複素数(complex)の3種類あります。これらを生成する際には型宣言は必要なく、数値リテラルからPythonのインタープリターが自動的に判断してくれます。本記事では、数値型の特徴や生成方法、そしてそれぞれの組み込み関数の使い方の基本についてまとめました。, Pythonで割り算の商と余りを求める方法についてまとめます。/演算子と//演算子の違いや、divmod()関数を使って商と余りを同時に求める方法についても記載しました。, 【Python】辞書にキーが存在しない時だけ値を登録する方法(setdefault、not in演算子), [Python] 文字列の大文字・小文字変換 (str.upper, str.lower etc..), copy.copy()、copy.deepcopy()を使ってデータをコピーする方法, 「参照(reference)」とは、データの存在する箇所を示す値であり、それぞれID(=識別子)が付与されます。. これは、変数bに新しい数値を代入した時点で新しいオブジェクトが生成された(=参照先が変わった)為です。, 元の値を変更せずにリストをコピーするには、Pythonの標準ライブラリのcopyモジュールを使います。このモジュールは、, を提供しています。これらを使ってコピーすることで、別のIDを参照するようになります。 その結果、下記の例の様にリストaとリストbは同じID(識別子)、つまり同じ「参照」を示します。, ここでリストbの要素を変更すると、リストbの参照先の値が変更されます。   a = [5, [6], [7, [8]]]      (1) 深い部分の要素を変更 具体例を以下に示します。, copy()関数を使うことで、リストa、リストbにそれぞれ異なるIDがアサインされたことがわかります。, <参考>copy.copy()はリストだけでなく他のシーケンス型(タブル、文字列)や辞書もコピーすることができます。, また、入れ子になったリストなど、他のオブジェクトを含む複合オブジェクトをコピーする際は、copy.deepcopy()を使います。, 辞書もcopy()メソッドをサポートしていますので、こちらのほうが簡単に書けると思います。, リストを別の変数にコピーして新しいリストと使い分けるには以下に注意する必要があります。. リストの要素をひとつだけ変更して新しいリストを作る際に、元のリストも値が変わってしまって困ったことはありませんか?  一方、浅いコピー(b=a[:])とした後に、a[1][0] = 5とすると、bも連動して、b = [ 1, [5], [3, [4]] ]となるので、図のa[1][0] =の部分は点線になっています。 2.コメントアウト 配列をコピーする numpy.copy.  例えば、「参照渡し」(a = 3 →  b = a)では、aとbは同じ場所に記憶された3を共有します。しかし、aを再定義すると、3を記憶したbをそのまま放置し、aは全く別の場所に記憶された新しい値を覚え直します。だから、「参照渡し」だとしても、それぞれ、独立した変数と見なすことができるのです。, 具体例でまとめます。a = [5, [6], [7, [8]]]  を、bに「参照渡し」「浅いコピー」「深いコピー」した場合の例を示します。, (a)「参照渡し」(b=a)をした後に、aかbのどちらかの「要素を」変更すると、他方の変数の値も連動して変更されます。ただし、変数全体を入れ替えると、それは「変数の再定義」となるので連動しません。, (b)「浅いコピー」(b=a[:], b=copy.copy(a))を行った後に、aかbのどちらかの「一番上の要素」を変更しても、他方の変数の値は連動して変更されません。しかし、それよりも深い部分の要素を変更すると、他方の変数は連動して変更されます。なお、変数全体を入れ替えると、それは「変数の再定義」となるので連動しません。, (c)「深いコピー」(b=copy.deepcopy(a))した後に、aやbにどんな変更を加えても他方の変数に影響をあたえず、それぞれ、完全に独立した変数です。, ※「参照渡し」「浅いコピー」「深いコピー」のいずれの場合も変数全体を入れ替え、「変数の再定義」を行うと連動しません。  どうですか?ひとまず、半分ぐらいはすっきりしたでしょ?, 次はリストの「参照渡し」「浅いコピー」「深いコピー」について説明します。変更不能体よりは覚えることが多いのですが、整理して覚えれば単純です。, それぞれの書式は、以下の通りです。浅いコピーは「スライス」を使ったb=[:]の方が楽ですよね。コロン「:」を忘れないようにしましょう。, コード05は「参照渡し」b=aを行ったあとに、aの値を変更し、bの値と連動するかを確認しています。 文字列の書式設定はPython2.6からformatメソッドが追加され、%演算子を使った古い文字列書式設定よりも、このformatメソッドを使った方がよいと思います。でも、Pythonのチュートリアルで簡単に紹介されていますし、古いコード... 「Pythonチュートリアル」を検索すると、「基本的な内容が勉強できる」「良い本である」「初心者がいきなり読むのは難しい」「Pythonの資格の出題範囲」といった内容がヒットします。よい本だけど、基本的な本なのに、初心者には難しい?そこで... Pythonの平面トラス解析プログラムの入力データ作成方法について説明します。慣れないうちはトラスの形状や荷重を配列で表現するのが難しいかもしれませんが、図を見ながら理解してください。各変数の内容を覚えなければプログラム全体が見えてきません。. これに伴い、下記の様に同じIDを参照しているリストaの値も変更されたように見えます。 1.解説する用語 (参考:スライスが使えないのは、ディクショナリ型は要素に順番という概念がないため、要素の何番目から何番目といった指定ができないからです。), しかし、ディクショナリ型の中にディクショナリ型を入れるなんてことが実際にあるのかな?, setもリストと同じ考え方で理解できますが、リストと違い変更不能体しか要素にすることができません。したがって、入れ子にすることができないため、setには要素に深い部分がありません。つまり、「浅いコピー」でも「深いコピー」でも、それぞれ完全に独立した変数となります。わざわざ「深いコピー」使う意味もありません。   a[0] = 5,   a[1] = [6],   a[2] = [7, [8]],   なお、ディクショナリ型と同様にスライスを使ったコピーb=a[:]という表記はできません。, (参考1:setは変更可能体であるsetを要素にすることはできません。)  (2)リストの一番上の要素を変更  どうでしょうか?さらに、1割ぐらいはすっきりしたのでは?, リストの「参照渡し」はb=aという形で行います。コード05のような「変数の再定義」は例外ですが、参照渡しの後に、aの「要素の」内容を変更すれば、bも変わります。逆にbの「要素を」変更をすれば、aが変わります。「参照渡し」を行うことで、完全に内容が連動する変数ができあがります。, 以下、具体例を示します。コード06の#★★★の行でaを変更する場合、連動してbが変更されるかどうかを整理します。, 1.aとbが連動しないケース Pythonのオブジェクトの代入処理は、「参照」渡しによって行われます。本記事では、この代入処理について解説すると共に、copy.copy()やcopy.deepcopy()を使ったデータコピーの方法についてまとめています。       a[1][0] = 6,   a[2][0] = 7,   a[2][1]=[8],   a[2][1][0] = 8, リストの「浅いコピー」は、b=a[:], あるいはimport copy;  b=copy.copy(a)の書式で行います。浅いコピーは一番上の要素を入れ替える場合は連動しませんが、リストの中にリストが入っているような場合、深い部分の要素を変更する場合には連動します。, 以下、具体例を示します。コード07の#★★★の行でaを変更する場合、連動してbが変更されるかどうかを整理します。, 1.aとbが連動しないケース       a[1][0] = 6,   a[2][0] = 7,   a[2][1]=[8],   a[2][1][0] = 8, リストと同じなので、説明は省略します。ただ、ディクショナリ型ではスライスを使ったコピー  b=a[:]という表記はできません。以下、コード09を参考にしてください。 【「参照渡し」「浅いコピー」「深いコピー」まずは理屈抜きで覚えよう。】の続編です。今度は、変数のデータのしくみを図示しながら、なぜ、参照渡しはデータが連動し、浅いコピーは深い部分だけが連動するのかを説明します。このしくみがわかれば関数の引数    (1) 上記「変数の再定義」の時以外   a[0] = 5,   a[1] = [6],   a[2] = [7, [8]], 2.aとbが連動するケース Pythonでは、コードの中に半角の「#」(ハッシュタグ)を使用すると、「#」を記述した行の「#」以降のコードを無効にできます。例えば行の最初を「#」にすると... 意外に難しい「コンテナ」「シーケンス型」「イテラブル」「整数型」「ミュータブル」「イミュータブル」などの分類を整理し、覚え方を紹介します。Pythonのチュートリアルやドキュメントを読むとき、これらの用語が理解できないと読み進められません。この機会に頭の中を整理しましょう。, 「CP932」を「Shift JIS」だと思って使っていませんか? 入出力ファイルのデフォルト文字コードは? Windowsの「Shift JIS」には落とし穴がたくさんあります。最初が肝心ですので、後回しにしないようにしましょう。. (3) 変更不能体しか要素にできないため、setには深い部分がない。つまり、「浅いコピー」「深いコピー」ともに、それぞれ完全に独立した変数になります。つまり、わざわざ、コピーの遅い「深いコピー」を使用する意味がないので、「浅いコピー」b=copy.copy(a)によりコピーします。, う~ん、すっきりしませんね。NumPy以外の基本的なものは、だいたい押さえたと思うんですが、やっぱり、Pythonは新しいのを使う前には確認しなくちゃダメかも。NumPy配列も記事書きま~す。(以下、記事を追加しました。), お得な紹介特典ですが(2020/11/30)をもって紹介特典の制度自体がなくなることになりました。 「参照渡し」「浅いコピー」「深いコピー」がどんな結果になるかを、まずは理屈抜きで覚えましょう。数値型、タプル型、文字列、リスト、ディクショナリ、セットがどんな風になるのかを具体的に細かく説明した記事は、なかなか見つけられませんでしたので、この記事で説明します。, さて、「参照渡し」「浅いコピー」「深いコピー」は、きちんと理解していなければ怖いです。コード01, 出力01はよく目にする例題です。a = [1]とlistを代入し、b = aで、bも[1]となります。でも、aの内容を変えると、bの内容も変わってしまうのです。aとbは連動しています。, 一方、listではなく数値型の場合は、aとbは連動せず、それぞれ独立した変数になっています。なぜ、違うの!, これを最初に知ったとき、私は恐怖を覚えました。しかも、どうやら「参照渡し」「浅いコピー」「深いコピー」という3種類のコピーの仕方があるようなのです。この違いの存在を示す記事はよく見かけるのですが、それぞれの型がどうなるのかを詳しく説明している記事は見つけられず、「ひとつひとつ、確かめないと怖くて使えない・・・」というのが正直な感想でした。, 変更不能体には、数値型、文字列、リスト(list)、ブール型、フローズンセットがあります。変更不能体は、「参照渡し」「浅いコピー」「深いコピー」の区別を考える必要がありません。b=aという表記だけを覚えればよく、コピーの後、それぞれの変数は独立しています。 ある配列(ndarrayやリスト)をコピーして別のndarrayとして扱うには、numpy.copy を使用します。 同様の関数は、ndarrayに対しても定義されており、ndarray.copy を使用しても実現可能です。 Pythonの代入は参照そのものがコピーされるため、同じオブジェクトに別名をつけ …  一方、参照渡し(b=a)とした後に、a[0] = 5とすると、bも連動して、b = [ 5, [2], [3, [4]] ]となるので、図のa[0]=の部分は点線になっています。, 下の図では、浅いコピー(b=a[:])とした後、リストaの要素を変更した場合に、連動してリストbの値が変更されるかどうかを実線と点線で区別しています。 Pythonを中心にプログラミングについて学んだことを備忘録として残していきます!   a[1][0] = 6,   a[2][0] = 7,   a[2][1]=[8],  a[2][1][0] = 8, リストではa=[5, 3, 4, 2]とか、a=['りんご', 'みかん', 'イチゴ']のように、リストの要素にリストを含まない形が多いと思います。このような場合には「浅いコピー」により、それぞれ独立した変数にすることが可能です。, リストの「深いコピー」は、import copy;  b=copy.deepcopy(a)の書式で行います。深いコピーは、すべての変更が連動しない、それぞれ独立した変数にすることができます。, 以下、具体例を示します。コード08の#★★★の行でaを変更する場合、連動してbが変更されるかどうかを整理します。, 1.aとbが連動しないケース (2) 「参照渡し」(b = a)はリストと同じ。   a = [5, [6], [7, [8]]] ,   ②変数の再定義:ケース02、ケース04 ※左辺が「変数名 =」の形になっている。, 「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。つまり、例えばケース02ではa = [5]で、aはそれまでのbと共有していた記憶場所のことは放置したまま、別の記憶場所に定義し直します。だから、aとbは全く別の独立した変数になるのです。, つまり、bにaを「参照渡し」「浅いコピー」「深いコピー」のいずれの方法でコピーしたとしても、「変数を再定義」した時点で、aとbは別の独立した変数になります。   a = [5, [6], [7, [8]]], 2.aとbが連動するケース   また、私はExcelとVBAが大好きなのです。プログラムでお金を稼いでいるわけではないので、これで十分。Excelはとにかく入出力が楽。入力データの加... Pythonの勉強で実際に私が購入した書籍を紹介したいと思います。たくさんの書籍の紹介を見ていると、調べれば調べるほど何がよいのかわからなくなってしまいます。私の選択がBestであるとは思っていませんが、購入に至った動機や感想などが少しで... 平面トラスの有限要素法のプログラムをPythonで組んでみました。以前に自分がつくったコードを引っ張り出してきて、Pythonに移植しました。このくらいのボリュームのプログラムにじっくり取り組むと面白いですね。, VPSサーバーのDjangoプロジェクトを、まずNginxだけで公開します。次にgunicornも連携させます。なお、NginxとDjango(gunicorn)はソケットではなく、httpで接続します。STATIC_URL等の意味も説明します。, Python♪NumPyの「参照渡し」と「コピー」を覚えよう。リストとは全然違う。, 「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。. 紹介特典をご利用される場合は、2020年11月30日 23:59までにNURO 光へのお申し込みを完了する必要があります。. これが今回の事象のからくりです。, この場合はリストaの値は変わりません。 【「参照渡し」「浅いコピー」「深いコピー」まずは理屈抜きで覚えよう。】の続編です。今度は、変数のデータのしくみを図示しながら、なぜ、参照渡しはデータが連動し、浅いコピーは深い部分だけが連動するのかを説明します。このしくみがわかれば関数の引数なども理解しやすくなると思いますので、ご一読ください。, さて、続編を書くまで1年もかかってしまいました。最初から書きたかった記事なのですが、どんな図が分かりやすいのか悩みました。浅いコピーを説明しようとすると複雑になっちゃうんですよね。私がExcelで描いた図にご期待ください。, 同じような図を使っていますので、以下の記事も参考にしてください。変数の値の変更について説明しています。この記事への導入にもなりますし、ミュータブル(変更可能体)、イミュータブル(変更不能体)の違いがはっきりします。, コード01は、3行目で参照渡しを行っています。変数aにはイミュータブル(変更不能体)が代入されているため、その後6行目でbの内容を変更してもaの内容は連動しません。bのidも違うidになっています。Pythonでは有名な例題です。, これを図示します。コード01の3行目の「a = 3」において、最初はまず右辺の3の部分が実行され、整数オブジェクト3が生成されます。この整数オブジェクトは変数aとは独立しており、変数aとは別の場所に記憶されます。, 次に「a = 」の部分が実行され、整数オブジェクト3が保存されているアドレス(出力01の3行目の1517121056番地)が変数aに代入されます。変数aには整数ではなく参照先アドレスだけが代入されます。, 変数aから整数3を取り出すときには、変数aの参照先アドレス(id)から、整数オブジェクト3が参照されることになります。, 次に「b = a」では参照渡しが行われます。参照渡しでは変数bに変数aの参照先アドレス(id)がコピーされます。ある意味、純粋に変数aがそのまま変数bにコピーされたとも言えます。, 同じ整数オブジェクト3を参照しているので、「b = 5」とすると連動してaも変化するように思うかもしれませんが、整数オブジェクト3は変更不能体です。「b = 5」では、i番地の整数オブジェクトを5に変更できないので、整数オブジェクト3はそのまま放置し、別のk番地に整数オブジェクト5を作ります。そして、変数bは参照先をk番地に変更します。出力01を見ると、変数bのidが変更されているのがわかります。, このように、イミュータブル(変更不能体)であるオブジェクトは変更できないので、変数の変更は再定義しかなく、他の変数に影響を与えることはあり得ません。, 仕組みがわかれば、イミュータブルが連動しないことが明快にわかります。したがって、イミュータブルの場合、参照渡しであってもお互い完全に独立した変数しか出来ません。つまり、以下に述べる浅いコピーや深いコピーを行う必要はありません。, コード02も有名な例題です。リストは先ほどの整数と違いミュータブル(変更可能体)です。従って、8行目で変数bの要素の変更をすると、変数aの内容まで連動して変更されます。, リストの場合も、最初は「a = [2, 3]」の右辺の[2, 3]が実行され、リストオブジェクトが生成されます。, 次に「a = [2, 3]」の左辺である変数aにリストオブジェクト[2, 3]が保存されているアドレスが代入されます。, さて、上の図を少し複雑にします。「浅いコピー」を説明するための準備です。実はリストの要素である整数2や整数3はリストに直接入っているわけではなく、別の場所に整数オブジェクトとして独立して存在しています。リストオブジェクトには整数オブジェクトのアドレスm1とm2が代入されているだけなのです。, 変数bに参照先のアドレスが渡されます。参照渡しなので、同じリストオブジェクトを共有します。ここまでは、先ほどの整数の場合と同じ流れです。, 下図も上図を詳しくしたものです。同じようにリストオブジェクトの中に整数が直接代入されているわけではないので本当は下図のようになっています。, コード02の8行目では、b[0] = 5により要素が変更されました。左辺は変数名だけではなく要素を示す「[0]」がついていることに注目してください。, リストはミュータブル(変更可能体)なので、要素を変更することが可能です。従って、イミュータブル(変更不能体)の場合とは異なり、リストオブジェクトは参照先アドレスがi番地のまま内容が変更されました。, 上図を詳しくしたものを下図に示します。[2, 3]の2を変更するときm1番地にある整数オブジェクト2はイミュータブル(変更不能体)ですから、「b[0] = 5」により要素の変更を行うと整数オブジェクト2は放置され、m3番地に整数オブジェクト5が再定義されます。, なお、この内容が理解しにくい場合は以下の記事を参考にしてください。本当は変数には参照先のアドレス(id)しか入っていない, 出力02を見れば、要素の変更の前後でa[0]、b[0]の参照先アドレスがいずれも1448963584番地から1448963680番地に変更されていることがわかります。, もし、コード02の「b[0] = 5」が、「b = [5, 3]」だったらどうなるでしょうか。それは、下の図のようにリストオブジェクト[5, 3]が再定義されます。値の代入では「変数名 = 値」という書式で代入するとミュータブルであったとしても必ず再定義されます。左辺が変数名だけであることに注目してください。, 出力03では、変数bの参照先のアドレス(id)が2379324095112から2379324187592に変更されていることがわかります。, もちろん、再定義ですのでミュータブル(変更可能体)あっても、値の変更が連動しません。, 余談となりますが、再定義した場合でも出力03をよく見るとa[1]とb[1]のidが同じになっています。再定義なら全く別のidになるはずです。, 実は変数aのリスト[2, 3]で整数オブジェクト3が生成済みなので、変数bの[5, 3]の3も同じ整数オブジェクト3を再利用しています。同じものを2度も作るなんて無駄ですよね。これは、Python内部のメモリー節約・スピードアップ術です。しかし、そこまで考えると複雑になりすぎます。再定義した場合には上の図のように全くあたらしいリストオブジェクトを生成したと考えたので問題ありません。, なぜなら、整数3はイミュータブル(変更不能体)だからです。イミュータブルは変更できないため、値を変更するときは元の整数オブジェクト3を放置します。つまり、同じ整数オブジェクト3を共有していたとしても、値の変更が他の変数に影響を与えることがないのです。→ 本当は変数には参照先のアドレス(id)しか入っていない, 難しそうな話をしましたが、結局、「再定義でも本当はデータを共有していることがある。しかし、細かい内部のデータ処理の話なので無視し、全く新しい別の変数を定義したと考えてもよい」ということです。, いよいよ、ミュータブル(変更可能体)の浅いコピーの説明です。ここまでの内容が理解できれば、それほど難しいことではありません。, 要素が全て整数で構成されたリストについて浅いコピーを行った場合、リストの要素を変更しても他の変数は連動しません。ただし、リストの要素がミュータブルの場合には、リスト深い部分(リストの要素の要素)を変更すると連動してしまいます。, 連動する部分と連動しない部分の区別がはっきりしない場合は以下の記事を参考にしてください。 「参照渡し」「浅いコピー」「深いコピー」まずは理屈抜きで覚えよう。, コード04の3行目「a = [2, 3]」では、変数aにリスト[2, 3]を代入しています。今までの説明のとおり、下の図のようになっています。, コード04の4行目では変数bに浅いコピーを行いました。参照渡しでは変数a、変数bは同じリストオブジェクトを参照していましたが、浅いコピーでは変数が参照するリストオブジェクトもコピーされています。, しかし、浅いコピーなのでリストオブジェクトが参照している整数オブジェクト2, 3は共有しています。このように、浅い部分(リストオブジェクト)だけコピーしているので浅いコピーと呼びます。英語ではshallow copy(シャローコピー)といいます。, ここまで読み進められたのであれば、変数bの要素を変更するとどうなるか予想できるのではないでしょうか。, 要素の変更b[0] = 5では、整数オブジェクト2は放置され、m3番地に新しい整数オブジェクト5が再定義されます。変数bの要素の変更は変数aに影響を与えません。, このように、リストの要素がイミュータブル(変更不能体)の場合には浅いコピーをすることで、それぞれの変数は独立し互いに影響を与えないのです。, ただし、上の図で、整数オブジェクトの部分がリストだったらどうなるでしょうか。浅いコピーでは一番浅い部分のリストオブジェクトまでがコピーさるだけなので、それより深い部分にリストのようなミュータブル(変更可能体)があると、深い部分のリストの要素の変更は連動してしまうのです。, コード05は4行目で浅いコピーが行われています。 浅いコピーでは一番上の要素の変更は連動しませんが、 11行目のb[0][0] = 5のような深い部分の変更は、変更の内容が連動してしまいます。, なお、上の図のリストオブジェクト[5, 2]は、リストオブジェクトの中に整数オブジェクトの5や2が入っているような図になっていますが、実際にはリストオブジェクトから別のところにある整数オブジェクトの5や2を参照しています。, コード06は、結果だけ見ると深い部分の要素が1→5となっているように見えますが、7行目では浅い部分のb[0]をリストオブジェクトごと入れ替えています。したがって、bの変更が連動していません。, 慣れないと、コード05の場合のようにb[0][0] = 5とした場合と混同してしまいますので注意しましょう。, さて、最後は深いコピー(deep copy)の説明です。深いコピーは全く独立した別の変数を生成するので、どんな変更を行っても連動しません。, なお、先ほども「3.ミュータブル(変更可能体)の参照渡し」の「(4) 余談」で記述しましたが、完全独立と言いながらidが同じになっている部分もあります。しかし、Python内部の細かい節約術ですので、無視して完全独立であると考えてください。, 完全独立なので、図にするほどのこともないですが、同様に図示します。まずは、コード07の3行目で変数aを生成します。, 以上で、「参照渡し」「浅いコピー」「深いコピー」の図による説明は終了です。変数には参照先アドレスのみが代入され、変数に代入された整数などのデータは独立したオブジェクトとして別の場所に保管されていることは覚えておきましょう。, タプルやディクショナリなどの組み込み関数は、データの管理の方法が同様ですが、外部ライブラリであるNumPyはデータ管理の方法が全く異なります。 NumPy などの外部ライブラリーは、その仕様をそれぞれ確認する必要があるので注意してください。, 以下、私が実際に購入したPythonの教材をまとめてみました。 Pythonを学習する上で、少しでもお役に立つことができればうれしいです。, ・Python♪私が購入したPythonの書籍のレビュー・UdemyのPythonの動画講座を書籍を買う感覚で購入してみた, 以下、私が光回線を導入した時の記事一覧です。 (1) 2020年「光回線は値段で選ぶ」では後悔する ←宅内工事の状況も説明しています。 (2) NURO光の開通までWiFiルーターを格安レンタルできる  (3) NURO光の屋外工事の状況をご紹介。その日に開通! (4) 光回線開通!実測するとNURO光はやっぱり速かった  (5) ネット上のNURO光紹介特典は個人情報がもれないの?, お得な紹介特典ですが(2020/11/30)をもって紹介特典の制度自体がなくなることになりました。