Python学習17日目のマスターU(@Udemy11)です。
2月も終わりに近づき、春の訪れを感じられるようになってきました。
釣りが大好きな私は、そろそろ海のお魚さんたちも活発に活動しだす頃なので、釣りに行きたくてウズウズしています。
とはいえいまは、Python学習365日チャレンジを継続しているところなので、余裕ができるまでは釣りを封印しておきます。
今回は、理解にちょっと苦しんだ値渡しと参照渡しです。
昨日の復習
昨日は次のリストのメソッドを学習しました。
index()
リスト中の指定した値のindex値を求めます。
,(カンマ)のあとに、indexの位置を指定すれば、指定した位置から検索を開始します。
count()
リスト中に、指定した値がいくつあるか求めてくれます。
sort()
リストを昇順に並べなおします。
reverse()
リストを降順に並べ替えます。
sort()のオプションに【reverse=True】と指定することで同じ結果がえられます。
split()
文字列の中の指定された値で文字を切り分けてリストを作成します。
()の中に指定する値を入力します。
join()
リテラルの中に指定する値を入れて.join()をつなげることで、リストを指定した値でつなげた文字列に変換します。
値渡しと参照渡し
リストの値渡しと参照渡しについて、講座の中ではイメージ図をつかって解説されているのですが、余計にこんがらがってしまいました。
メモリの番地を使って解説してくれているのですが、値渡しの方は理解できたものの、参照渡しがイメージしづらく理解できませんでした。
そこで、リストの場合は参照してるだけという勝手解釈をすることにしました。
それではその勝手解釈を解説していきます
値渡し
値渡しは、次の変数へ値を渡してしまうことで、もともとの変数が影響を受けることはありません。
例えば、次のような場合です。
x = 20
y = x
y = 5
print(x, y)
出力結果
20 5
変数xに20を代入し、変数yに変数xを代入したあと、変数yに5を代入するというものですが、変数yには5が代入されていますが、変数xは20のままです。
変数xの値だけを変数yにわたしているので、もともとの変数xが変数yの変化によって影響を受けるということはありません。
参照渡し
一方、参照渡しは次のような場合です。
x = [1, 2, 3, 4, 5]
y = x
y[0] = 100
print(x, y)
出力結果
[100, 2, 3, 4, 5] [100, 2, 3, 4, 5]
リストの場合、変数xにリストを代入し、変数yを変数xとした場合、リストがそのまま変数yに代入されるのではなく、変数xを参照してくださいというだけになります。
なので、変数yのindex0の値を100に変更するという命令をすれば、参照している変数xのindex0の値を変更することになるわけです。
リストの場合はcopy()を使って値を渡す
リストで値渡しをするためには、【y = x】にするのではなく、変数xのコピーを変数yに代入するようにします。
x = [1, 2, 3, 4, 5]
y = x.copy()
y[0] = 100
print(y, x)
出力結果
[100, 2, 3, 4, 5] [1, 2, 3, 4, 5]
copy()と同じようにリストをコピーするもう一つの方法が[:]を使った方法です。
x = [1, 2, 3, 4, 5]
y = x[:]
y[0] = 200
print(y, x)
出力結果
[200, 2, 3, 4, 5] [1, 2, 3, 4, 5]
両方とも同じ結果が得られますが、他のプログラマーが理解できるようにするために【copy()】を使ったほうがいいとのことでした。
IDを確認してみる
変数を指定すると、自動的にIDが振られます。
そのIDを確認してみましょう。
x = [1, 2]
y = x
print(id(x), id(y))
出力結果
4536704840 4536704840
この場合、参照渡しになるので、IDはどちらも同じIDになります。(数字はランダムで選ばれる)
a = [1, 2]
b = a.copy
print(id(b), id(a))
出力結果
4536704904 4537547208
変数bには変数aをコピーした値が代入されるので、IDが違うものになります。
どんどん難しくなる
酒井さんの講座を進めていくと、どんどん新しいことが出てきてどんどん難しくなっていきます。
まだ講座全体の8%程度しか進んでいないので、まだまだこれからが本番ですが、じっくり焦らず学んでいきます。
じっくりPythonを学びたいのなら、ぜひ一度酒井さんの講座を受講してみてください。