関数の引数としてリストを渡すとどうなるか

Python
スポンサーリンク

Python学習中の者です。学習したことを書いていきます。

例えば以下のようなコードを考えます。リストを実引数として関数に渡し、関数内で処理をして、結果を引数の指すリストに代入します。

def sisoku(a,b,x):
	x[0] = a + b
	x[1] = a - b
	x[2] = a * b
	x[3] = a / b

a,b = 2,3	
lst = [None] * 4
sisoku(a,b,lst)	

関数sisokuは仮引数として変数a,b,xを受け取ります。a,bそれぞれの加減乗除の値を仮引数x(リスト)に代入します。

実行結果は以下のようになります。(上のコードでprint文は省略)

lst [None, None, None, None]
a,b 2 3
lst [5, -1, 6, 0.6666666666666666]

関数に渡す前のリストは値が全部Noneです。 関数内での計算結果を仮引数xに代入するとそれが呼び出し元のリストlstにも反映されています。何が起こっているのでしょうか?

それを調べるために print(“id(lst)”,id(lst)) などをコードに追加し、lstのアドレスとxのアドレスを調べます。

def sisoku(a,b,x):
	x[0] = a + b
	x[1] = a - b
	x[2] = a * b
	x[3] = a / b
	print("id(x)",id(x))

a,b = 2,3	
lst = [None] * 4
print("id(lst)",id(lst))
sisoku(a,b,lst)
print("id(lst)",id(lst))

実行結果
lst [None, None, None, None]
id(lst) 414524616320
id(x) 414524616320
a,b 2 3
lst [5, -1, 6, 0.6666666666666666]
id(lst) 414524616320

関数に渡す前のリストlstのアドレスが「414524616320」です。関数の中でリストxのアドレスを表示していますがそれは「414524616320」で実引数lstの指しているアドレスと同じです。引数ではリストのアドレスが渡されることがわかります。

関数内でこのリストxに計算結果を入れています。関数から戻ってきた後で実引数lstのアドレスを表示しても「414524616320」で同じものを指しています。関数に渡したことで参照先は変更されることはありません。

このことを使うとretunr文を書かなくても関数の処理結果を得ることができます。

この記事は以上です。