Python入門 参照渡し(動画あり)

Pythonの参照渡し

Pythonは全ての型が参照渡しになっています。
ただし、イミュータブルな型のものはデータが更新されると新たなメモリ領域を確保する仕組みになっています。
それは値渡しのような動きをします。

ミュータブルな型とイミュータブルな型

  • ミュータブルな型:リスト型、辞書型、集合型
  • イミュータブルな型:int型、float型、str型、タプル型など

イミュータブルなデータが更新されると新たなメモリ領域を確保して元の値は変更されません。
現在の値がどこに確保されているか確認するには、id()関数を使います。
id()関数はオブジェクトのid番号を調べることができます。

イミュータブルとはオブジェクトを変更できないことで、ミュータブルはオブジェクトを変更可能ということです。
オブジェクトの変更とオブジェクトを変数に割り当てることは別ものです。 Pythonでは変数はオブジェクトに付けられたラベルにすぎません。つまりオブジェクトを変数に割り当てるということは、名前を付けただけです。
もう少し言うとオブジェクトを参照しているだけです。

例えば、整数はint型でイミュータブルです。

  1. 変数に整数を代入すると、その整数の値に名前が付けられたことになります
  2. 同じ変数に違う値を代入すると、その値はイミュータブルなため変更は不可能です。そのためPythonは別の場所に新しい値を置き、変数は同じ名前で違う場所の値を参照するようになります
  3. id()でidを調べるとそれがわかります

次に、list型のミュータブルな値で同様のことをします。

  1. 変数にリストを代入すると、そのリストの値に名前が付けられたことになります
  2. 同じ変数に違う値を追加すると、その値はミュータブルなため変更は可能です。そのためPythonは同じ場所に新しい値を追加し、変数は同じ場所の値を参照するようになります
  3. id()でidを調べるとそれがわかります

コード例

# イミュータブルな例
num = 10 
print(id(num),num) 
num2 = num
print(id(num2),num2) 

結果
10914784 10
10914784 10

# ミュータブルな例
l = [1,2,3] 
print(id(l),l)
l2 = l
print(id(l2),l2) 
l2.append(4)
print(id(l),l)  
print(id(l2),l2) 

結果
140016123693704 [1, 2, 3]
140016123693704 [1, 2, 3]
140016123693704 [1, 2, 3, 4]
140016123693704 [1, 2, 3, 4]

参考になった書籍

プログラミングを少しでも経験がありPython の文法を学習する場合は、「入門 Python 3」が良いと思います。長く使えます。

「退屈なことはPython にやらせよう」はオブジェクト指向の解説がないです。代わりにPythonを使った便利な実例が初心者には嬉しい内容です。正規表現から、簡単なスクレイピング 、画像操作などあります。ただし、中級者以上には少し物足りないかもしれません。

サンプルのダウンロード

ここでダウンロードする「reference1.ipynb」ファイルは、この動画で使用したものです。

reference1.ipynb

Python入門一覧