関数が形成する名前空間
実行中のプログラムにおいて、識別子とそれに対応するオブジェクトを対応づけるためのデータベースのことを名前空間という。
code:name_space1.py
def func1():
x = 1
y = 2
func1() # (1):関数呼び出し
解説:
呼び出し (1) で関数func1の処理が開始されるとともにこの関数が管理する名前空間が形成される。
関数func1の内部でインスタンスの生成+変数の割り当てを行うと、これらの対応関係は名前空間に登録される。
関数処理の終了とともに、名前空間はメモリ上から抹消される。
code:name_space2.py
def func1():
x = 1
y = 2
def func2():
x = 10
y = 20
func1()
func2()
複数の関数定義が行われる場合、関数呼び出しによってそれぞれのローカルスコープに対応した名前空間が生成されている。
name_space2.pyの動作解説:
1.関数func1が呼び出される。このとき形成された名前空間を青い枠で表す。
https://scrapbox.io/files/652a234ed46bf6001c490cbb.png
2.関数func1においてインスタンス1を生成し、それを変数xに割り当てる。名前空間に変数とインスタンス1との対応関係が登録された様子を下図のように表す。
https://scrapbox.io/files/652a239bd1d1bf001be56075.png
3.関数func1においてインスタンス2を生成し、それを変数yに割り当てる。
https://scrapbox.io/files/652a23c1e603ba001bc76b89.png
4.関数func1の処理が終了する、これが管理していた名前空間とともに変数x,yが削除されるため、割り当てられていたインスタンス1,2が削除される。(参考:インスタンスの有効期間)
https://scrapbox.io/files/652a24316fb169001c4264d2.png
5.関数func2が呼び出され、新たな名前空間が生成される。
https://scrapbox.io/files/652a24ee69c879001cdb6048.png
6.先程と同様にインスタンスを生成し、それを変数に割り当てる。
https://scrapbox.io/files/652a255c4d78d2001bcdb647.png
7.関数func2の処理が終了すると、これが管理していた名前空間がメモリ上から削除されるため、変数x, yが消え、これらが割り当てられていたインスタンスが削除される。
https://scrapbox.io/files/652a24316fb169001c4264d2.png
再確認:
スコープ:識別子が有効となる範囲
名前空間:識別子とオブジェクトの対応関係