名前解決
名前解決とはプログラムに記述された識別子から、利用するべき対象を決定することである。以降の解説では、正確を期すために「識別子」という語句を用いているが、より具体的なイメージを求めるならばこれを「変数名」や「関数名」に置き換えてもらうとよい。
識別子はそれが作られたスコープに属しているため、識別子を利用するにあたっては、それがいずれのスコープに属するかを決定する必要がある。Pythonでは階層的なスコープの関係をもとに対応関係の解決を図る。
1.ローカルスコープ
2.グローバルスコープ
3.ビルトインスコープ
ここで示した数字は階層の深さであり、そのスコープがチェックされる優先度を表している。
あるスコープにおいて識別子が用いられたとき、
そのスコープと、より下位のスコープに対して優先度の順にチェックが行われる。
該当する識別子が見つかった時点でそれが対象として採用される。
見つからなければ、それは新たな識別子として扱われる。
code:name_solve1.py
def func():
print('ユーザ関数') # (4)
x = 1 # (1)
print('私はビルトイン') # (2)
func() # (3)
どこかで定義されている識別子の扱い
(2) の関数名「print」について:
2.グローバルスコープを探すが見つからない。
3.ビルトインスコープの中に見つかるのでこれが採用される。
(3) の関数名「func」について:
2.グローバルスコープの中に見つかるのでこれが採用される。
(4) の関数名「print」について:
1.関数 func のローカルスコープを探すが見つからない。
2.グローバルスコープを探すが見つからない。
3.ビルトインスコープの中に見つかるのでこれが採用される。
未定義の識別子の扱い
(1) の変数名「x」について:
2.グローバルスコープを探すが見つからない。
3.ビルトインスコープを探すが見つからない。
いずれのスコープの中でも見つからないので、xは新たな識別子として扱われる。
新たな変数xをグローバルスコープに追加し、これに値を代入する。