戻り値
戻り値とは、関数の処理が終わる段階で呼び出し元に返すデータのことである。
Pythonは動的型付け言語であるため、関数定義の際に戻り値の型を指定する必要が無く、また、実際に戻り値として返すオブジェクトの型は自由である。
code:ret1.py
def func_ret(x):
if x == 1:
return 1 # インスタンス「1」のID
elif x == 2:
return 'moji' # str型インスタンスのID
elif x == 3:
return 7, 5, 3 # リスト型インスタンスのID
elif x == 4:
return None # NoneのID
elif x == 5:
return 7, 5, 3 # タプル型インスタンスのID
# この例では関数終端の return 文を略している、その場合はNoneのIDを返す
n = int(input('Input 1-5 Number ? '))
result = func_ret(n)
print(result, type(result))
上記「x == 5」の場合のように複数の戻り値を与えた場合、これらは1つのタプルとして返される。
引数を受ける側ではこれをアンパック代入を用いて変数に格納する。
返しているもの
戻り値として返されているのはインスタンスではなく、それを指すオブジェクトIDです。
code:ret2.py
def func():
x = 1 # (1)
print(id(x))
return x
y = func() # (2)
print(id(y))
関数funcの処理が終了すると、これが管理するスコープに含まれる全ての変数が削除される。インスタンス本体ではなくそれを指している変数が削除されるのである。インスタンスの有効期間によると、参照されなくなったインスタンスは削除対象となるのだが、関数の戻り値はどのように扱われているのであろうか。
上で示したret2.pyの場合、
1. 関数func内の変数xが削除され、その結果、(1) で生成したインスタンス「1」への変数の割り当てが失われる。
2. その代わりに、(2) で戻り値を受け取ったグローバルスコープの変数yがこのインスタンスに割り当てられる
3. 結果として、関数func内で生成したインスタンス「1」のライフタイムが継続することとなる。
https://scrapbox.io/files/65068d322165bf001c5a4660.png